查看 HTTP 请求的数据.

news/2024/11/28 21:43:30/

文章结构

    • 如果是 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://www.ppmy.cn/news/109728.html

相关文章

Jenkins+Python自动化测试之持续集成详细教程

前言 今天呢笔者想和大家来聊聊JenkinsPython自动化测试持续集成,废话呢就不多说了哟咱们直接进入主题哟。 一、Jenkins安装 ​ Jenkins是一个开源的软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供…

【MySQL】MySQL 字段为 NULL 的5大坑

数据准备 建立一张表 数据如下: 1.count 数据丢失 count(*) 会统计值为 NULL 的行,而 count(列名) 不会统计此列为 NULL 值的行。 select count(*),count(name) from person; ----------------------- count(*) | count(name)10 | 8-------…

使用docker和minio实现对象存储

文章目录 使用docker和minio实现对象存储什么是minio安装minio使用minio 使用docker和minio实现对象存储 什么是minio ​ Minio是一个开源的分布式文件存储系统,它基于 Golang 编写,虽然轻量,却拥有着不错的高性能,可以将图片、视频、音乐、…

Java程序设计入门教程-- switch选择语句

switch选择语句 情形 虽然if…else语句通过嵌套可以处理多分支的情况,但分支不宜太多,在Java语言中,提供了switch语句可以直接、高效地处理多分支选择的情况。 格式 switch (表达式) { case 常量表达式1&#x…

中台分类

大家好,我是易安,之前我们谈到过中台的概念,以及如何落地中台。今天我就带你一起看一看,行业常见的中台分类。 业务中台与数据中台 业务中台 业务这个词,其实是有些宽泛的,我听到很多人口中说的业务都不是…

Canvas画布基本功能及实现网页签名功能

canvas 简介 <canvas> 是 HTML5 新增的&#xff0c;一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画&#xff0c;甚至可以进行实时视频处理和渲染。和所有 DOM 元素一样&#xff0c;拥有自己…

2023年9月数学建模:黄河小浪底调水调沙问题

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 1. 引言 2. 黄河小浪底水利枢纽工程概述 3. 调水调沙问题的数学建模 3.1 调水问题的数学建模 3.2 调沙问题的数学建模 4. 数学建模案例…

基于深度学习的高精度山羊检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度山羊检测识别系统可用于日常生活中或野外来检测与定位山羊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的山羊目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…