文章结构
- 如果是 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源码解析
欢迎与作者一起交流技术和工作生活
联系作者