查看 HTTP 请求的数据.

我们可能会碰到 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源码解析

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

联系作者

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire Fish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值