java HttpServletRequest 重复流读取(转载记录)

此博客提供了一个链接https://www.cnblogs.com/exmyth/p/10332328.htmll ,原标签包含Java,推测该链接内容与Java相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 解决方案概述 为了实现 `HttpServletRequest` 输入流的多次读取,在 Java Servlet 或 Spring Boot 应用程序中可以采用自定义过滤器的方式。通过创建一个包装类来保存请求体的内容,从而允许后续处理逻辑能够反复访问这些数据。 ### 实现方式 #### 创建自定义请求对象 首先构建一个新的类继承于 `HttpServletRequestWrapper` 并重写其 `getInputStream()` 和 `getReader()` 方法: ```java import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.*; public class MultiReadRequest extends HttpServletRequestWrapper { private final String body; public MultiReadRequest(HttpServletRequest request) throws IOException { super(request); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; try (InputStream inputStream = request.getInputStream()) { if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); char[] charBuffer = new char[128]; int bytesRead; while ((bytesRead = bufferedReader.read(charBuffer)) != -1) { stringBuilder.append(charBuffer, 0, bytesRead); } } } finally { if (bufferedReader != null) { bufferedReader.close(); } } body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); return new DelegatingServletInputStream(byteArrayInputStream); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } } ``` 此代码片段展示了如何捕获原始请求中的输入流并将其转换成字符串形式以便之后再次提供给其他组件使用[^1]。 #### 配置过滤器应用上述封装后的请求对象 接着配置一个过滤器用于拦截所有传入的 HTTP 请求并将它们替换为我们之前定义好的多读支持版本: ```java import org.springframework.stereotype.Component; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class RequestBodyReadingFilter extends HttpFilter { @Override protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException { // 将原生request替换成MultiReadRequest实例 MultiReadRequest multiReadReq = new MultiReadRequest(req); // 继续执行链上的下一个filter或目标资源 chain.doFilter(multiReadReq, res); } } ``` 这段代码实现了对进入系统的每一个HTTP请求都进行了预处理操作——即把标准版的`HttpServletRequest`改造成具备重复读功能的新类型`MultiReadRequest`[^2]。 以上就是关于如何在Java Web应用程序中让`HttpServletRequest`支持多次读取的方法介绍。这种方法不仅适用于普通的Servlet环境也兼容Spring MVC/Spring Boot项目架构下的开发需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值