查看 HTTP 请求的数据.

文章结构

    • 如果是 GET 请求
    • 如果是 POST 请求
      • 方法1:DEBUG 窗口(**爽、超级爽、吴迪爽**):
      • 方法2:写方法读取流中数据(繁琐,难用):

我们可能会碰到 MVC 拿不到前端的参数,在排查时不知道是哪个环节出现了问题,但是总的确认下 http 请求中是不是把参数携带过来了吧,下面作者将介绍如何获取到请求中的数据

如果是 GET 请求

如果是 GET 请求,那么很简单,完整的数据都在 uri 中,你可以很方便的通过 servlet 规范提供的接口查到。比如你可以按下面的方法操作:

// 打一个断点在 Spring MVC 的 DispatcherServlet 类的 doDispatch 方法上,在 IDEA 的 debug 窗口中执行
request.getParameterMap()   // 查看所有参数

如果是 POST 请求

如果是 POST 请求,会稍微麻烦点,因为它的数据是存放在流中的不太方便直接查看。通常有如下两种方法

方法1:DEBUG 窗口(爽、超级爽、吴迪爽):

查看的步骤介绍如下:

1、打一个断点在 Spring MVC 的 DispatcherServlet 类的 doDispatch 方法上

2、post 请求中 body 的数据存放在这个位置: ((Http11InputBuffer) ((RequestFacade) request).request.coyoteRequest.inputBuffer).byteBuffer.hb

3、然后把上面的字节数组转成字符串就行了。用 IDEA 的 debug 窗口执行下吧

4、完整命令如下:

// 查看 post 请求中 body 数据的
new String(((Http11InputBuffer) ((RequestFacade) request).request.coyoteRequest.inputBuffer).byteBuffer.hb)

很简单读者自行操作一下:查看请求 body 的数据,确认下请求中有没有携带参数

5、随后你就可以方便快速的定位问题啦啦啦

方法2:写方法读取流中数据(繁琐,难用):

注意事项:三种方式是冲突的,只能读取一次。重复读取会报 java.io.IOException: Stream closed 异常

写一个工具类来读取流的数据。工具代码如下:

package com.firefish.pretty.handler;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;public class HttpServletRequestReader {// 字符串读取// 方法一public static String readBodyAsChars(HttpServletRequest request) {BufferedReader br = null;StringBuilder sb = new StringBuilder("");try {br = request.getReader();String str;while ((str = br.readLine()) != null) {sb.append(str);}br.close();} catch (IOException e) {e.printStackTrace();} finally {if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}}return sb.toString();}// 方法二public static void readBodyAsChars2(HttpServletRequest request) {InputStream is = null;try {is = request.getInputStream();StringBuilder sb = new StringBuilder();byte[] b = new byte[4096];for (int n; (n = is.read(b)) != -1; ) {sb.append(new String(b, 0, n));}} catch (IOException e) {e.printStackTrace();} finally {if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}}// 二进制读取public static byte[] readBodyAsBytes(HttpServletRequest request) {int len = request.getContentLength();byte[] buffer = new byte[len];ServletInputStream in = null;try {in = request.getInputStream();in.read(buffer, 0, len);in.close();} catch (IOException e) {e.printStackTrace();} finally {if (null != in) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}return buffer;}
}

传送门: 保姆式Spring5源码解析

欢迎与作者一起交流技术和工作生活

联系作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254675.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发,开发工具采用Microsoft Visual Studio 2010集成开发环境,后台编程语言采用C#编程语言来进行编程开发,数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息,整个…

【软硬件测试】测试经验:软硬件结合测试要点

目录 一、应用行业 二、测试要点 三、硬件测试 (1)测试含义 (2)测试方法 (3)相关链接 四、结合测试 (1)测试含义 (2)测试工具 (3&am…

【ros/ros2】LCN及ros2节点的LCN改写

文章目录 序言1. ros2两种节点类型2. LCN是什么3. LCN状态转换4. LCN状态转换要做的事5. LCN节点功能划分6. ros2节点的LCN改写 序言 背景:ros2节点改写为lifecycle node节点 1. ros2两种节点类型 Node:和ros1中一样的节点基类LifecycleNode&#xff…

桶排序 — 计数排序和基数排序

计数排序 int类型数组,其中存的是员工的年龄。比如说16 - 150。对于这样的数据来讲,数据状况是受限的。此时如果将数组从小到大进行排序,该如果实现? 这个实现很简单,实现一个统计数组范围从 0 ~ 150,遍历原…

816墨盒计算机无法与,816墨盒怎么加墨 816墨盒加墨方法及注意问题【详解】

导语:随着时代的快速发展,人们生活水平的不断提高,打印机在我们日常生活中的应用也变得非常广泛,利用打印机打印文件,还有一些重要的材料,方便了人们的生活,给人们的生活提供了很大的便利&#…

打印机 检测到用过的耗材或者赝品耗材

检测到用过的耗材或者赝品耗材 大家好,今天续着给大家分享下惠普的803/805墨盒加墨应该注意的事项,先预习,加墨就没那么多困惑了~ 加墨后打印白线条、溅墨怎么办? ①先用温水浸泡打印头约30秒(注意不要泡到芯片&…

打印机墨盒问题

因为打印机墨盒属于耗材,容易损坏,从而造成打印机没法打印。对于家用打印机来说,一个打印机也就三四百块钱,然后换一个新墨盒就得花掉一百左右,心里感觉贼不爽,墨盒那么小一个,居然要那么贵&…

墨盒 连供漏墨恒压问题

你提出了一个连供压力平衡原理的问题。 连供形状各式各样,但基本原理都是相同的。 以红色为例: 如上图。打印机静止时,墨水室的墨水重力,等于墨水室上方因为空气变稀薄后产生的负压。墨水不会流动。实现了压力的静平衡。 打印机工…

【Java 并发编程】深入理解 AQS - AbstractQueuedSynchronizer

深入理解 AQS - AbstractQueuedSynchronizer 1. AQS1.1 什么是 AQS1.2 AQS 具备的特性 2. AQS 原理解析2.1 AQS 原理概述2.1.1 什么是 CLH 锁2.1.2 AQS 中的队列 2.2 AQS 共享资源的方式:独占式和共享式2.2.1 Exclusive(独占式)2.2.2 Share&a…

JVM学习笔记(中)

1、垃圾回收算法 标记清除法 特点: 速度较快会产生内存碎片 注意:这里的清除并不是真正意义上的清除,即每个字节都清0,而是记录一下被清除的对象的起始和结束的地址,当下一次分配给一个新对象时,新对象…

《Java并发编程实战》课程笔记(四)

互斥锁 原子性问题到底该如何解决呢? “同一时刻只有一个线程执行”这个条件非常重要,我们称之为互斥。如果我们能够保证对共享变量的修改是互斥的,那么,无论是单核 CPU 还是多核 CPU,就都能保证原子性了。 锁模型 …

RK3588平台开发系列讲解(驱动基础篇)设备树常用 of 函数

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查找节点的 of 函数二、获取属性值的 of 函数三、实验示例3.1、查找的节点代码3.2、获取属性内容代码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 设备树描述了设备的详细信息,这些信息包括数字类型的…

chatgpt赋能python:Python中-1的用法介绍

Python中-1的用法介绍 什么是-1? 在Python中,-1是一个特殊的索引值,它表示从序列的末尾开始向前数1个元素。这在对于列表、字符串、元组等序列类型进行操作时非常有用。 如何使用-1? 假设我们有一个列表: l [1, …

SpringBoot框架理解

1 SpringBoot入门 1.2 什么是SpringBoot 1 官网的解释 ​ Spring在官方首页是这么说的:说使用SpringBoot可以构造任何东西,SpringBoot是构造所有基于Spring的应用程序的起点,SpringBoot在于通过最少的配置为你启动程序。 2 我的理解 SpringBoot是Sp…

Flask-RESTful的使用

Flask-RESTful的使用 Flask-RESTful基本使用安装定义资源Resources创建API实例添加资源到API运行Flask应用 请求处理请求解析参数校验 响应处理数据序列化定制返回格式 其他功能蓝图装饰器集合路由命名规范路由名称 Flask-RESTful Flask-RESTful是一个用于构建RESTful API的扩展…

计算机对社会的应用是什么,电子计算对人类社会有什么贡献?应用的领域又有哪些?...

在人类历史上,蒸汽机的发明和电力的使用,曾经在生产技术上引起过划时代的工业革命,然而,这种革命,从本质上来讲,它仅仅是涉及到代替人的体力劳动,但电子计算机的发明,已经涉及到代替…

一位美女博士的人脸识别历程

2019-01-28 16:44:37 1月21日,科技评论期刊《麻省理工科技评论》发布了2018年“35岁以下科技创新35人”(35 Innovators Under 35)中国榜单。商汤科技研究总监、年仅29岁的石建萍博士荣登此榜,凭借在计算机视觉原创技术的卓越创新…

Android仿微信发图片的样式,做IM的同学的病有救了

一:前言 最近在搞IM,真的特别痛苦。脑袋大,对于我这种菜鸟来说太难了,比现在社会娶个媳妇还难,硬着头皮搞,终于文字,语音,表情搞完了,开始搞图片,看着微信发…

软件压力测试图片60张,看图测压力,你抗压么?

你压力大么?快跟K线君一起来测测! 平行线 下图里的横线都是平行的 涉世越深的人,受社会侵蚀越严重 看到的直线越变形 你还是单纯的你吗? 你能看出几条笔直的横线? 我想静静 这是一张静止的图片 你的心理压力越大&#…

网络安全入门学习:社会工程学

在电影《我是谁:没有绝对安全的系统》中,主角本杰明充分利用自己高超的黑客技术,非法入侵国际安全系统,并在最后逃之夭夭。在电影中,有一句经典的台词: 所有黑客手段中最有效的、最伟大的幻想艺术——社会…