查看 HTTP 请求的数据.

news2024/12/31 4:17:31

文章结构

    • 如果是 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.coloradmin.cn/o/591276.html

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

相关文章

何时加索引,性别字段和逻辑删除字段应不应该加

首先哪些地方加索引(按照sql执行顺序写) 1、from表扫描连接处索引 2、where后条件去走索引 3、group by加索引 4、select查询不用加 5、order by排序加索引 (对于第四点,覆盖索引:查询的字段都被索引覆盖,…

chatgpt赋能python:Python中用什么表示空格

Python中用什么表示空格 空格在编程中是一个非常重要的概念,特别是在Python中。Python是一门非常灵活的语言,空格是它语法的一个关键组成部分。今天我们将探讨的是Python中用什么表示空格。 空格是Python中的一个重要概念,它被用来表示代码…

spdk记录

spdk记录 hello_bdev命令行参数 往期文章: spdk环境搭建 hello_bdev 代码路径:examples/bdev/hello_world/hello_bdev.c 可执行文件路径:build/examples/hello_bdev 刚开始直接执行hello_bdev显示找不到Malloc0 ./build/examples/hello_b…

Vue3-devtools开发者工具正确安装方法

目录 前言:1、下载安装2、添加扩展 前言: 最近在学习Vue3,学习Vue3自然离不开调试工具Vue3-Devtools,所以我们需要来下载这个调试工具并放入谷歌浏览器里的扩展程序里面。帮助我们更好的调试vue3里的程序。 1、下载安装 Github下…

【C#图解教程】第四章 类型、存储和变量 学习笔记总结

类型 C#是一组类型声明,这个与第三章:命名空间就是一组类型声明可以一起理解。类型是一个用来创建数据结构的模板: 使用这个模板创建对象的过程叫做实例化,所以创建的对象也叫实例 类型成员 简单类型可能只包含一个数据成员&…

JavaEE HTTPS加密原理

HTTPS加密原理✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & HTTPS加密原理1. 为什么要加密2. HTTPS加密原理2.1 初始想法2.2 引入非对称加密2.3 中间人攻击2.4 引入证书 JavaEE & HTTPS加密原理 1. 为什么要加密 例子:(运营商劫持) 你可能经常…

C语言system()函数

文章目录 C语言system()函数system(“pause”)system(“color num1num2”)system(“cls”)system(“title name”)system(“time /T”) & system(“date /T”) C语言system()函数 头文件&#xff1a; #include<stdlib.h>system(“pause”) 作用&#xff1a;暂停程序进…

AI Canon精选资源清单;带AI功能的PS安装文件与教程;讯飞星火10月对标 ChatGPT;直播换脸工具盘点 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; AI Canon&#xff1a;人工智能精选资源清单 思维导图 ShowMeAI知识星球资源编码&#xff1a;R106 AI Canon 是由美国著名的风投机构 …

【靶场实战】Vulnhub - JANGOW: 1.0.1 靶标实战

靶场地址&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 靶场IP&#xff1a;192.168.160.215 信息收集 使用Nmap对目标进行扫描 Nmap -sV -O -p- 192.168.160.215 经过漫长的等待扫描完成&#xff0c;该靶标开启了21、80两个端口&#xff0c;21端口运行服务为f…

chatgpt赋能python:Python中按钮的位置摆放

Python中按钮的位置摆放 在Python应用程序中&#xff0c;按钮是常见的交互元素之一。按钮通常用于响应用户的操作&#xff0c;例如提交表单或执行某些功能。然而&#xff0c;在设计应用程序时&#xff0c;按钮的位置是一个重要的问题&#xff0c;因为它将直接影响用户体验和应…

chatgpt赋能python:Python中的画图——创建漂亮的可视化图像

Python中的画图——创建漂亮的可视化图像 Python是一个高度可编程的语言&#xff0c;因此它非常适合用于创建各种类型的可视化。 在本文中&#xff0c;我们将介绍Python中的画图。我们将讨论如何使用Python和一些流行的数据可视化库来创建漂亮的可视化图像。我们还将探讨如何…

【PWN · ret2libc】[2021 鹤城杯]babyof

Linux_64的经典ret2libc题目&#xff0c;有必要好好整理总结一下其中的流程和注意点 目录 前言 一、题目重述 二、exp&#xff08;思考与理解在注释&#xff09; 三、经验总结 攻击步骤: 注意要点 四、疑问 前言 64位Linux和32位Linux确乎有着关于参数传递上的不同&a…

chatgpt赋能python:Python中怎么转置矩阵

Python中怎么转置矩阵 在Python中&#xff0c;我们可以轻松地实现矩阵的转置操作。矩阵转置是指将矩阵的行列互换&#xff0c;即将矩阵的行转换为列&#xff0c;将列转换为行。这种操作在数据处理和科学计算中是很常见的&#xff0c;因此我们需要了解如何在Python中进行矩阵转…

人工智能粒子群优化三大算法

粒子群优化是以邻域原理&#xff08;neighborhood principle&#xff09;为基础进行操作的&#xff0c;该原理来源于社会网络结构研究中。驱动粒子群优化的特性是社会交互作用。群中的个体&#xff08;粒子&#xff09;相互学习&#xff0c;而且基于获得的知识移动到更相似于它…

6.S081——补充材料——RISC-V架构中的异常与中断详解

0.briefly speaking 我在阅读Xv6源码过程中对很多概念感到困惑&#xff0c;想到也许会有其他人对此秉持同样的困惑&#xff0c;所以我将我的研究和学习过程总结下来并编篡成如下的博客。本篇博客想对RISC-V标准中有关中断和异常的概念进行一个梳理&#xff0c;考虑RISC-V标准的…

root 密码破解(rd.break)

在Linux系统中&#xff0c;忘记root密码时&#xff0c;可以用此方法进行暴力修改root密码 示例&#xff1a; 设置一个新的记不住的密码 $ echo cnakdnvf | passwd --stdin root $ poweroff 1.启动此虚拟机&#xff0c;选中以下行&#xff0c;并按 【 e 】进入内核编辑页面 …

【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】

Leetcode Leetcode -746.使用最小花费爬楼梯Leetcode -747.至少是其他数字两倍的最大数 Leetcode -746.使用最小花费爬楼梯 题目&#xff1a;给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择…

数电/数字电子技术期末考前突击复习(小白稳过,看这一篇就够了)

博主&#xff1a;命运之光 专栏&#xff1a;期末考试必过and不挂科and争高分&#x1f636;‍&#x1f32b;️还有其他科目的考试突击日后会陆续更新 ✨✨✨✨✨点赞&#xff0c;关注&#xff0c;收藏不迷路✨✨✨✨✨ &#x1f984;前言&#xff1a;总结了期末数电大概率可能…

MySQL进阶 -存储引擎

目录 存储引擎MySQL的体系结构存储引擎简介InnoDB存储引擎MyISAM存储引擎Memory存储引擎InnoDB&#xff0c;MyISAM和Memory的区别存储引擎的选择小结 存储引擎 MySQL的体系结构 MySQL的体系结构图&#xff1a; MySQL服务端的体系结构&#xff08;MySQL Server&#xff09;&am…

自动化测试经典面试题-定位不到元素

元素定位常见的面试相关问题 一、元素定位1、Selenium/Appium定位方法有几种&#xff1f;分别是&#xff1f;2、如何通过子元素定位父元素 二、元素定位不到1、定位不到元素是什么原因导致的&#xff1f;2、如何定位动态元素3、有的元素就加载页面上&#xff0c;但是你却定位不…