继承HttpServletRequestWrapper自定义,重复消费请求参数

使用HttpServletRequestWrapper解决无法多次获取request Body的问题 在使用AOP编程的时候,经常碰到需要多次获取整个请求的body的情况。例如:典型场景下我们要在AOP切面中做日志记录或权限校验,此时需要调用request.getInputStream获取输入流,从而读取整个请求的消息体。但是这通常会触发一个异常:java.lang.IllegalStateException: getInputStream() can't be called after getReader()。 出现这个问题的原因是默认的HttpServletRequest对象中的getInputStr 阅读详情
package com.xxx.request;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author coco
 * @date 2022/3/24
 */
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private final String body;

    public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        InputStream is = null;
        StringBuilder sb = null;
        try {
            is = request.getInputStream();
            sb = new StringBuilder();
            byte[] b = new byte[4096];
            for (int n ; (n = is.read(b)) != -1;)
            {
                sb.append(new String(b, 0, n));
            }
        } finally {
            if(is != null) {
                is.close();
            }
        }
        body = sb.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes());
        return new ServletInputStream() {

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }
            @Override
            public int read() throws IOException {
                return bais.read();
            }

            @Override
            public void close() throws IOException {
                bais.close();
            }
        };
    }

    public String getBody() {
        return body;
    }
}

深入解析HttpServletRequestWrapper:如何高效缓存并复用请求流数据 本文深入解析了HttpServletRequestWrapper在Java Web开发中的核心应用,针对Servlet请求流只能读取一次的限制,提供了通过包装器缓存请求体数据的完整解决方案。文章详细阐述了如何实现BufferedRequestWrapper来高效缓存流数据,并探讨了在过滤器与拦截器中集成的正确方式,同时权衡了性能与内存开销,为日志记录、签名验证等需要重复读取请求体的场景提供了最佳实践。 阅读详情

相关推荐

SpringBoot实战:如何优雅解决getReader()重复调用问题(附完整代码)

本文深入剖析了SpringBoot项目中因Servlet规范限制导致的`getReader()`重复调用异常问题,并提供了基于`HttpServletRequestWrapper`和`Filter`的生产级优雅解决方案。通过自定义请求包装器缓存请求体,实现安全、高效的多次读取,确保拦截器验签与Controller中`@RequestBody`参数解析的兼容性。

weixin_28475533的博客 285

2、继承HttpServletRequestWrapper实现HttpServletRequest复用

继承HttpServletRequestWrapper实现HttpServletRequest复用

cabbagexiu的博客 1347

SpringBoot 实战:如何优雅地解决多次读取请求体的问题

本文深入探讨了SpringBoot开发中请求体只能读取一次的问题根源,并提供了基于HttpServletRequestWrapper和Filter的优雅解决方案。通过创建可缓存请求体的包装类及全局过滤器,实现了请求体的重复读取,确保拦截器进行签名校验或日志记录时不影响后续Controller中@RequestBody的正常使用。

weixin_29247219的博客 261

继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数

一 简介 如题所示,有时候我们需要在一个请求到达Controller之前能够截获其请求,并且根据其具体情况对 HttpServletRequest 中的参数进行过滤或者修改。这时,有的同学可能会想:我们是否可以在一个Filter中将 HttpServletRequest 里的所有参数都取出来分别进行过滤然后再放回到该HttpServletRequest 中呢? 很显然,在 HttpServle

lawliet的博客 1万+

Spring Boot Filter里重复读取HttpServletRequest的Body?一个Wrapper类搞定(附MultipartFile避坑)

本文详细介绍了在Spring Boot中如何通过自定义HttpServletRequestWrapper类解决HttpServletRequest Body重复读取的问题。文章深入分析了Servlet规范的设计原理,提供了完整的缓存请求体实现方案,并特别讲解了处理MultipartFile上传时的注意事项,帮助开发者优雅地解决这一常见难题。

weixin_30856725的博客 230

Spring Boot中如何优雅地解决HttpServletRequest流只能读取一次的问题(附完整代码)

本文深入探讨了Spring Boot中HttpServletRequest输入流只能读取一次的问题根源,并提供了基于HttpServletRequestWrapper的优雅解决方案。通过构建可缓存请求体的包装器,并集成到高优先级过滤器中,实现了请求体数据的全局复用,有效解决了拦截器与Controller层多次读取请求体的冲突。

weixin_29216049的博客 113

基于Spring Boot应用ServletRequestWrapper和ServletResponseWrapper

记录:277 场景:在过滤器Filter的doFilter中,拦截一个http请求。对请求对象ServletRequest,按照业务需求进行处理,比如参数验证、SQL注入拦截、日志审计等。对应答对象ServletResponse,按照业务需求进行处理,比如统一返回数据格式,加密返回数据,压缩返回数据等。...

zhangbeizhen18的博客 2241

【SpringBoot笔记30】SpringBoot之自定义HttpServletRequestWrapper实现流的重复使用

HttpServletRequestWrapper是javax.servlet包下提供的一个类,它是专门用于对HttpServletRequest请求对象进行包装的类,通过继承HttpServletRequestWrapper类,重写其中的方法,就可以对HttpServletRequest对象进行一些自定义的修改,例如:自定义HttpServletRequestWrapper类,对request流进行包装,实现流的重复使用,解决流关闭问题,这在实际的开发项目中,可能会经常遇到。

✅ Java 开发工程师 2152

Spring Boot中HttpServletRequestWrapper实战:解决请求体重复读取与参数修改

在Java Web开发中,Servlet规范定义的HttpServletRequest对象存在单次消费性限制,其输入流一旦被读取便无法复用,这给请求日志记录、参数校验、数据脱敏等通用处理逻辑带来了挑战。装饰者模式为解决此类问题提供了优雅的实现路径,它允许在不改变原有对象接口的前提下动态增强功能。HttpServletRequestWrapper正是该模式在Servlet API中的具体体现,通过包装原始请求并重写关键方法,实现了请求数据的缓存与定制化处理。这一技术对于构建高安全性的后端服务至关重要,能有效支

weixin_33824385的博客 343

工程制图习题集张大庆课后习题答案解析

所以,我想向大家求助,希望能得到一些学习资料、学习方法和学习经验,帮助我更好地理解和掌握这门课程。在寻找学习资料的过程中,我发现了一款叫做资小料的APP,它里面有很多关于工程制图的学习资料,包括视频教程、习题解答和考试真题等。通过使用资小料,我逐渐掌握了工程制图的基本理论和方法,解决了很多学习中遇到的问题。在这里,我想推荐给和我一样在学习《工程制图习题集》这门课的同学们,希望大家也能从这款APP中受益,共同进步。上传者: 『Consentesdei』蒼迷穀。出版社: 清华大学出版社。

weixin_58833001的博客 925

17【Protues单片机仿真】基于51单片机的太阳能智能谷物翻晒机器人

基于51单片机,避障,低于50CM报警,LED灯亮起,自动翻晒用光敏电阻,光照强度大,电机转动,相当于翻晒粮食,远程控制用按键代替,按下去电机就转动,相当于翻晒粮食,然后光照强度和超声波的距离都在LCD1602显示屏显示出来。

weixin_70360261的博客 1448

解决request请求流只能读取一次的问题

解决request请求流只能读取一次的问题 实际开发碰到的问题 解决request请求流中的数据二次或多次使用问题实际开发碰到的问题 springboot项目中,为了防止sql注入,采用Filter拦截器对所有请求流中的json数据进行校验,请求数据没问题则继续向下执行,在后边的代码中应用到请求参数值时,发现request中的json数据为空; 除上边描述的情况,尝试过两次从request中获取json数据,第二次同样是获取不到的。 解决request请求流中的数据二次或多次使用问题...

t194978的博客 3815

GEOS-Chem笔记——模式下载安装+驱动数据+运行流程

看过我博客的会发现我写了很多CESM的笔记,但是说实话,平时科研我其实更多时候是GEOS-Chemuser。之所以写了很多CESM笔记,其实是因为不会,就边学边写。然后GEOS-Chem已经用比较熟了,所以也没想过做笔记啥的。但是我发现越来越多朋友私信我各种CESM问题,我觉得我可能给大家营造了一种我是CESM达人的错觉。感觉自己有点跑偏了呢。公平起见,我觉得我有必要补充点GEOS-Chem笔记。 GEOS-Chem是研究大气化学的人常用的大气化学传输模式,在全世界范围的大气化学研究组中被广泛使用。不过.

砍柴姑娘Jourosy的博客 1万+

DotNetPy:现代.NET 与 Python 互操作 实战指南坑

当然,不是所有流都只能读一次,基于内存的流(如 ByteArrayInputStream / CharArrayReader)支持重置指针,因为它们的数据源是内存中的数组(数据不会消失),可以通过 mark() 和 reset() 方法将指针 恢复 到标记位置。log.info("==========进入requestCachingFilter========");每次调用 read() / read(byte[]) / read(char[]) 等读取方法时,指针会向后移动对应字节数;

bbrMr41Y8的博客 303

实战对比:Lmcache+vllm将KVcache卸载到CPU和SSD的性能差异(附完整配置)

本文通过实战对比Lmcache与vLLM在KV Cache卸载到CPU和SSD的性能差异,详细解析了配置优化、基准测试及高级调优策略。实验显示,CPU卸载在低并发下表现优异,而SSD方案在高并发场景中更具性价比优势,为LLM推理任务提供了高效的存储解决方案。

weixin_30664051的博客 699

详细解释SigLIP的原理,为什么有些多模态模型喜欢用他?怎么应用于机器人控制呢

详细解释SigLIP的原理,为什么有些多模态模型喜欢用他?怎么应用于机器人控制呢。

具身机器人和通用AI 1226

从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具眉

当然,不是所有流都只能读一次,基于内存的流(如 ByteArrayInputStream / CharArrayReader)支持重置指针,因为它们的数据源是内存中的数组(数据不会消失),可以通过 mark() 和 reset() 方法将指针 恢复 到标记位置。log.info("==========进入requestCachingFilter========");每次调用 read() / read(byte[]) / read(char[]) 等读取方法时,指针会向后移动对应字节数;

Cgrd9TzMx的博客 335

YOLO26-seg分割优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 279

从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具

当然,不是所有流都只能读一次,基于内存的流(如 ByteArrayInputStream / CharArrayReader)支持重置指针,因为它们的数据源是内存中的数组(数据不会消失),可以通过 mark() 和 reset() 方法将指针 恢复 到标记位置。log.info("==========进入requestCachingFilter========");每次调用 read() / read(byte[]) / read(char[]) 等读取方法时,指针会向后移动对应字节数;

pcNxzO6o3的博客 369

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 685

SAP AI Core 高阶能力实战参考

文章摘要:本文探讨了在企业SAP架构中整合GenAI技术的工程化实践,重点分析了SAP AI Core的高阶能力应用。作者指出,企业级AI应用需解决多轮对话管理、Git同步工作流、提示词治理等核心问题,而非简单接入大模型API。技术方案展示了如何通过SAP AI Core的orchestration service管理对话历史,利用GitOps实现AI资产版本控制,并强调prompt template在审计合规中的治理价值。全文以SAP技术栈(ABAP/RAP/Fiori)为背景,阐释了AI能力与企业核心系

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 103

Spring Boot过滤器与拦截器:核心机制、应用场景与最佳实践

在Java Web开发中,请求处理链是构建安全、高效应用的基础架构。其核心原理在于通过不同层级的组件对HTTP请求进行预处理和后处理,从而实现对流量控制、安全防护和业务逻辑解耦的技术价值。过滤器(Filter)作为Servlet容器级别的组件,能对所有请求进行全局处理,常用于日志记录、跨域处理和XSS防护等基础安全场景;拦截器(Interceptor)则是Spring MVC框架层面的机制,可基于HandlerMethod进行精细控制,适用于权限校验和业务预处理等场景。本文结合线上故障排查经验,深入解析两者

weixin_34161032的博客 372

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

拦截请求,重写request并放入自定义数据

重写request并放入自定义数据

minjun的博客 1796

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

HttpServletRequestWrapper的使用与原理

HttpServletRequestWrapper 实现了 HttpServletRequest 接口,可以让开发人员很方便的改造发送给 Servlet 的请求.HttpServletRequest 对参数值的获取实际调的是org.apache.catalina.connector.Request没有提供对应的set方法修改属性所以不能对前端传来的参数进行修改,实际场所像过滤xss攻击,取认证token统一去除token前缀等需要进行请求参数的处理。

li12412414的博客 4304

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: LocalDateTime和时间戳互转
下一篇: Aggregation-聚合查询
Coco_淳
博客等级 码龄10年 40粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值