what is `ContentCachingRequestWrapper` does?

ContentCachingRequestWrapper 是 Spring Framework 中提供的一种包装类,它扩展了 HttpServletRequestWrapper 类,用于缓存请求体的内容。

通常在处理 HTTP 请求时,原生的 HttpServletRequest 对象中的输入流 (getInputStream()) 只能被读取一次,如果需要多次访问请求体内容(比如在进行过滤、校验或转发请求时),就会遇到问题。
ContentCachingRequestWrapper 解决了这个问题,通过在第一次读取请求体时将数据复制到一个缓冲区中,后续对请求体的读取操作会从这个缓冲区而不是原始输入流中获取数据。这样就允许开发者多次读取请求体而不会抛出异常,并且保持了请求体数据的一致性。

使用 ContentCachingRequestWrapper 时,通常是在应用的前置处理器、拦截器或者过滤器中创建并替换原来的 HttpServletRequest 实例,以便在后面的处理流程中安全地重复访问请求体内容。

在这里插入图片描述
使用样例:用在过滤器中

import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RequestBodyCachingFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 创建 ContentCachingRequestWrapper 对象来缓存请求体HttpServletRequest wrapper = new ContentCachingRequestWrapper(request);// 继续执行过滤链,并传递包装后的请求对象filterChain.doFilter(wrapper, response);// 在过滤链执行完毕后,可以访问缓存的请求体内容byte[] cachedBody = ((ContentCachingRequestWrapper) wrapper).getContentAsByteArray();// 在此处进行对请求体内容的处理或验证String requestBody = new String(cachedBody, request.getCharacterEncoding());// 示例:打印请求体内容System.out.println("The request body is: " + requestBody);}
}

使用样例:用在过滤器中

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.util.ContentCachingRequestWrapper;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RequestBodyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 创建 ContentCachingRequestWrapper 对象来缓存请求体ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);// 你可以在这里读取并处理请求体内容,例如进行预处理或验证byte[] cachedBody = wrappedRequest.getContentAsByteArray();String requestBody = new String(cachedBody, request.getCharacterEncoding());// 示例:打印请求体内容System.out.println("The request body is: " + requestBody);// 将包装后的请求对象传递给后续的处理流程request = wrappedRequest;// 如果需要继续执行请求处理,则返回 truereturn true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 可以在此处访问已经缓存的请求体数据}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 请求处理完成后,仍可以访问缓存的请求体数据}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427487.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:C/C++内存管理

C:C/C内存管理 C语言C语言内存分配回顾malloc & calloc & realloc & free Cnew & deletenew[ ] & delete[ ]定位newnew & delete原理 malloc / free 与 new / delete对比 C语言 C语言内存分配回顾 我们先回顾一下C语言的内存分配&#xf…

JS中splice方法的用法总结

1. 概述 JavaScript中的splice()方法是用于增加、删除或替换数组中的元素。这个方法可以实现数组的细粒度操作,非常灵活和强大。 2. 语法 splice()方法的语法如下所示: start:必需,表示开始删除或插入的索引位置。如果为负数,则从数组的末尾开始计算。deleteCount:可选…

音乐证书通过率发布,市场对持有者需求旺盛

音乐证书的考试难度备受关注,通过率终于揭晓。据官方公布的数据,该证书的通过率相对较低,需要考生在音乐技能和表现方面有出色的表现。然而,持有音乐证书的人才在市场上需求旺盛,各种音乐机构和企业对其表现出强烈兴趣…

历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!

本月,比特币庆祝了它的15岁生日,并以强势的姿态进军华尔街。最近美国交易所开始交易的比特币交易所交易基金(ETF),已经获得了投资者的广泛接受。这一进展标志着比特币作为一种年轻资产迈向成熟的重要里程碑。 根据Glas…

Linux的奇妙冒险———vim的用法和本地配置

vim的用法和本地配置 一.vim的组成和功能。1.什么是vim2.vim的多种模式 二.文本编辑(普通模式)的快捷使用1.快速复制,粘贴,剪切。2.撤销,返回上一步操作3.光标的控制4.文本快捷变换5.批量化操作和注释 三.底行模式四.v…

基于SpringBoot Vue美食网站系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

(学习日记)2024.01.23:结构体、位操作和枚举类型

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

Nodejs前端学习Day1

妈的,学vue3需要15.0以上的nodejs 文章目录 前言一、学习目标二、学习目录三、为什么JavaScript可以在浏览器中被执行四、为什么JavaScript可以操作DOM和BOM五、浏览器中的JavaScript运行环境总结 前言 妈的,学vue3需要15.0以上的nodejs 一、学习目标 二…

STL常用容器—stack与queue容器(栈与队列)

STL常用容器—stack与queue容器(栈与队列) stack容器1. stack容器模型图2. stack 基本概念3. stack 常用接口 queue 容器1. queue 容器模型图2. queue 基本概念3. queue 常用接口 参考博文1:<C> stack与queue容器概念模…

springboot118共享汽车管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的共享汽车管理系统 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获…

基于springboot+vue的海滨体育馆管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

2024年 IT 行业就业情况能否回春?很多人说道…

我只能说可以,以前我是看不到的。但是鸿蒙全栈自研让我重新看到希望! 2024年1月18日,华为鸿蒙千帆启航发布会。讲到HarmonyOS NEXT作为原生鸿蒙,其系统底座全栈自研,去掉了传统的AOSP 代码(“Android 开放…