SpringBoot怎么实现多次读取流
发表于:2025-11-21 作者:千家信息网编辑
千家信息网最后更新 2025年11月21日,这篇文章主要介绍了SpringBoot怎么实现多次读取流的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么实现多次读取流文章都会有所收获,下面我们一起
千家信息网最后更新 2025年11月21日SpringBoot怎么实现多次读取流
这篇文章主要介绍了SpringBoot怎么实现多次读取流的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么实现多次读取流文章都会有所收获,下面我们一起来看看吧。
1). 存在问题
流只能读取一次
2). 目标
多次读取流
3). 解决方法
创建包装类
4). RequestWrapper
package com.mazaiting.redeye.wrapper; import com.mazaiting.redeye.utils.StreamUtil;import lombok.extern.slf4j.Slf4j;import org.slf4j.Logger;import org.slf4j.LoggerFactory; import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.nio.charset.Charset; /*** * @author mazaiting * @date 2019-06-27 * @decription HttpServletRequest 包装器 * 解决: request.getInputStream()只能读取一次的问题 * 目标: 流可重复读 */@Slf4jpublic class RequestWrapper extends HttpServletRequestWrapper { /** * 日志 */ private static final Logger mLogger = LoggerFactory.getLogger(RequestWrapper.class); /** * 请求体 */ private String mBody; public RequestWrapper(HttpServletRequest request) { super(request); // 将body数据存储起来 mBody = getBody(request); } /** * 获取请求体 * @param request 请求 * @return 请求体 */ private String getBody(HttpServletRequest request) { try { return StreamUtil.getString(request.getInputStream()); } catch (IOException e) { mLogger.debug(e.getMessage()); throw new RuntimeException(e); } } /** * 获取请求体 * @return 请求体 */ public String getBody() { return mBody; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { // 创建字节数组输入流 final ByteArrayInputStream bais = new ByteArrayInputStream(mBody.getBytes(Charset.defaultCharset())); 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(); } }; }}5).设置过滤器(必须)
@Component@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")@Order(10000)public class HttpServletRequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ServletRequest requestWrapper = null; if(servletRequest instanceof HttpServletRequest) { requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest); } //获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中 // 在chain.doFiler方法中传递新的request对象 if(null == requestWrapper) { filterChain.doFilter(servletRequest, servletResponse); } else { filterChain.doFilter(requestWrapper, servletResponse); } } @Override public void destroy() { }}6). 使用
/*** * * @author mazaiting * @date 2019-06-26 * @decription Session 拦截器 */public class SessionInterceptor implements HandlerInterceptor { /** * 日志 */ private static final Logger mLogger = LoggerFactory.getLogger(SessionInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { mLogger.debug("SessionInterceptor"); // 获取地址 String url = request.getRequestURL().toString(); mLogger.debug("url: " + url); // 获取 session HttpSession session = request.getSession(); String id = session.getId(); mLogger.debug("sessionId: " + id); String requestMethod = request.getMethod(); mLogger.debug("requestMethod: " + requestMethod); String servletPath = request.getServletPath(); mLogger.debug("servletPath: " + servletPath); if (isJson(request)) { String body = new RequestWrapper(request).getBody(); mLogger.debug("body: " + body); } return true; } /** * 判断本次请求的数据类型是否为json * * @param request request * @return true: 是 JSON 数据; false: 非 json 数据 */ private boolean isJson(HttpServletRequest request) { if (request.getContentType() != null) { return request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE) || request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE); } return false; }}关于"SpringBoot怎么实现多次读取流"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"SpringBoot怎么实现多次读取流"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
数据
知识
内容
对象
方法
日志
目标
篇文章
问题
包装
价值
再次
地址
字符
字符串
字节
操作简单
数组
文章
易懂
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全手机窃密观后感
9月17日网络安全日
2022年网络安全相关比赛
dhc软件开发
上海政务软件开发价格
程序对数据库的影响
华齐泰软件开发
服务器禁止使用选定的身份
软件开发项目团队问题
网络安全防止与合理消费的方法
服务器尺寸
数据库行业的商业模式
简幻欢服务器加模组
从技术支持转到数据库
服务器属性自定义纸张找不到
潍坊易网互联网科技有限公司
网络安全标语图
路由器与服务器连接
易服牛网络技术
三维天地涉及网络安全吗
创建数据库 默认模式
学校网络安全演练方案通知
网络安全信息公司经营内容
数据库和表ppt
界面连接服务器
js 中查询数据库数据
心理微课守护网络安全
数据库不能模糊查询的
徐州网络安全海报
郑州车管所服务器在哪里