自定义类继承 HttpServletRequestWrapper

/*** @describe 目的是让其输入流可重复读* @author czx* @date 2020年5月15日22:53:35*/
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {/*** 存储body数据的容器*/private final byte[] body;public RequestWrapper(HttpServletRequest request) throws IOException {super(request);// 将body数据存储起来String bodyStr = getBodyString(request);body = bodyStr.getBytes(Charset.defaultCharset());}/*** 获取请求Body** @param request request* @return String*/public String getBodyString(final ServletRequest request) {try {return inputStream2String(request.getInputStream());} catch (IOException e) {log.error("", e);throw new RuntimeException(e);}}/*** 获取请求Body** @return String*/public String getBodyString() {final InputStream inputStream = new ByteArrayInputStream(body);return inputStream2String(inputStream);}/*** 将inputStream里的数据读取出来并转换成字符串** @param inputStream inputStream* @return String*/private String inputStream2String(InputStream inputStream) {StringBuilder sb = new StringBuilder();BufferedReader reader = null;try {reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset()));String line;while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {log.error("", e);throw new RuntimeException(e);} finally {if (reader != null) {try {reader.close();} catch (IOException e) {log.error("", e);}}}return sb.toString();}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream inputStream = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic int read() throws IOException {return inputStream.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}}

2.定义一个过滤器 Filter

@Slf4j
public class ReplaceStreamFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {ServletRequest requestWrapper = new RequestWrapper((HttpServletRequest) request);chain.doFilter(requestWrapper, response);}
}

3.创建过滤器配置类 FilterConfig

@Configuration
public class FilterConfig {/*** 注册过滤器** @return FilterRegistrationBean*/@Beanpublic FilterRegistrationBean someFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(replaceStreamFilter());registration.addUrlPatterns("/*");registration.setName("streamFilter");return registration;}/*** 实例化StreamFilter* @return Filter*/@Bean(name = "replaceStreamFilter")public Filter replaceStreamFilter() {return new ReplaceStreamFilter();}}

完成以上步骤即可在拦截器中读取request中的body数据

@Slf4j
@Component
public class APIInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{log.info("开始拦截请求");if(isJson(request)){String jsonParam = new RequestWrapper(request).getBodyString();JSONObject params = JSONObject.parseObject(jsonParam);......return true;}return false;}/*** 返回json数据给前端* @param response* @param json*/protected void returnJson(ServletResponse response, JSONObject json){PrintWriter writer = null;response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");try {writer = response.getWriter();writer.print(json.toJSONString());} catch (IOException e) {log.error("response error",e);} finally {if (writer != null)writer.close();}}/*** 判断本次请求的数据类型是否为json* @param request request* @return boolean*/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 -- request输入流重复可读相关推荐

  1. SpringBoot如何防止重复提交--use

    参考文章:SpringBoot如何防止重复提交 SpringBoot利用AOP防止请求重复提交 场景:同一个用户在2秒内对同一URL的提交视为重复提交. 思考逻辑: 1.从数据库方面考虑,数据设计的时 ...

  2. springboot 主键重复导致数据重复_Springboot实现防重复提交和防重复点击(附源码)...

    背景# 同一条数据被用户点击了多次,导致数据冗余,需要防止弱网络等环境下的重复点击 目标# 通过在指定的接口处添加注解,实现根据指定的接口参数来防重复点击 说明# 这里的重复点击是指在指定的时间段内多 ...

  3. SpringBoot解决用户重复提交订单(方式一:通过唯一索引实现)

    文章目录 前言 1.方案实现 1.1.给数据库表增加唯一键约束 1.2.编写获取请求唯一ID的接口 1.3.业务提交的时候,检查唯一ID 2.小结 前言 对于投入运营的软件系统(商城.物流.工厂等), ...

  4. 网页出现重复(双份)的可能原因之一:chain.doFilter(request, response);重复调用;

    这是原来的网页. 因为先要加个过滤器从而控制用户对于网站服务器的访问,以保证服务器的安全,即用户只能访问指定的网页 下面是MyFilter类的具体代码: public class MyFilter i ...

  5. springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法

    向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不 ...

  6. 重复读取输入流InputStream

    1.为什么InputStream不能重复读取 首先,熟悉Java的人可能都知道,Java中的Inputstream是不能重复读取的. 但是有没有想过,InputStream为什么不能重复读呢? 其实要 ...

  7. [转]2020年排名前20的基于SpringBoot搭建的开源项目,帮你快速进行项目搭建!

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 287 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) SpringBoot ...

  8. 2020年排名前20的基于SpringBoot搭建的开源项目,帮你快速进行项目搭建!

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 287 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) SpringBoot ...

  9. springboot 手动提交事务_分布式事务开局第一篇,从数据库事务隔离级别说起

    春节临近,松哥也有点无心撸码.不过很多时候,很多事情,我们不能由着自己的性子,还是要控制一下自己,这不,松哥最近又打算开一个坑,和大家聊一聊分布式事务,因为我们做微服务,分布式事务肯定是跳不过去的坎. ...

最新文章

  1. NetBeans 时事通讯(刊号 # 5 - Apr 29, 2008)
  2. 学python的好处-学习python有什么好处?python强大之处在哪?
  3. java判断表是否存在_java怎么判断表是否存在?
  4. python中递归函数特点,Python递归函数特点及原理解析
  5. 记一次CNVD通用漏洞审计
  6. JEECG 社区开源项目下载(总览)
  7. php设置session 生命周期,php会话(session)生命周期概念介绍及设置更改和回收
  8. CSS垂直居中的11种实现方式
  9. 49.Linux/Unix 系统编程手册(下) -- 内存映射
  10. 计算机病毒论坛,【本人整合】电脑病毒样本包大合集
  11. bzoj 2959: 长跑
  12. 使用icepdf将pdf转换为图片时出现乱码的问题
  13. 如何营造医院合理的组织文化和价值观?
  14. 软件设计模式从何而来?------“抄袭来的” 设计模式
  15. guava异步线程使用
  16. Python爬虫练习-查询lol隐藏分
  17. 宏观经济学第13版多恩布什笔记和答案
  18. 手机联系人不见了怎么恢复?简单的恢复方法
  19. 考研英语二-阅读解题技巧:
  20. VSCode + JSDoc 完美实现(almost)JavaScript代码提示

热门文章

  1. 大数据:从阿里数据分析岗看未来核心竞争力(六)
  2. 毕亚兹 USB3.0分线器 无法识别多个U盘问题解决
  3. AIGC:数字内容创新的新引擎,还有藏着更多你知道的细节
  4. php加入语音播报功能_如何使用PHP实现智能语音播报
  5. [论文阅读笔记51]关系抽取【DNN】综述(监督与远程监督)
  6. IDEA Ctrl+Alt+L快捷键与QQ/TIM冲突
  7. 浇灌迅雷幸福树 抽奖可领取会员3天
  8. 如何开发直播带货平台?
  9. STM32 TIM定时器 库函数学习笔记
  10. 图像尺寸调整 image resize C/C++