场景:在aop的日志中想获取 post请求的json数据时报错,因为在后台 控制器的接口中流已经读取了,导致日志这里获取就会报错,需要重写请求的 getInputStream  getReader,然后配置一个过滤器

1、requestWrapper

public class StreamWrapper extends HttpServletRequestWrapper{public String _body;public StreamWrapper(HttpServletRequest request) throws IOException {super(request);StringBuffer sBuffer = new StringBuffer();BufferedReader bufferedReader = request.getReader();String line;while ((line = bufferedReader.readLine()) != null) {sBuffer.append(line);}_body = sBuffer.toString();}@Overridepublic ServletInputStream getInputStream() {final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(_body.getBytes());return new ServletInputStream() {@Overridepublic int read() {return byteArrayInputStream.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener listener) {}};}@Overridepublic BufferedReader getReader() {return new BufferedReader(new InputStreamReader(this.getInputStream()));}}

2、定义一个过滤器

public class StreamFilter implements Filter {private  final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("/api/file/upload")));@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {ServletRequest requestWrapper = null;if(request instanceof HttpServletRequest) {HttpServletRequest servletRequest = (HttpServletRequest) request;String requestURI = servletRequest.getRequestURI();if (ALLOWED_PATHS.contains(requestURI)){chain.doFilter(servletRequest,response);}else {requestWrapper = new StreamWrapper(servletRequest);//获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中。// 在chain.doFiler方法中传递新的request对象chain.doFilter(requestWrapper, response);}}}@Overridepublic void destroy() {}
}

3、springboot配置过滤器

@Configuration
public class StreamConfig {@Value("${stream.enabled}")private String enabled;@Value("${stream.excludes}")private String excludes;@Value("${stream.urlPatterns}")private String urlPatterns;@Beanpublic FilterRegistrationBean StreamRegistration() {FilterRegistrationBean streamBean = new FilterRegistrationBean();streamBean.setDispatcherTypes(DispatcherType.REQUEST);streamBean.setFilter(new StreamFilter());streamBean.addUrlPatterns(urlPatterns);streamBean.setName("StreamFilter");streamBean.setOrder(Integer.MAX_VALUE);Map<String, String> initParameters = new HashMap<>(16);initParameters.put("excludes", excludes);initParameters.put("enabled", enabled);streamBean.setInitParameters(initParameters);return streamBean;}}

4、yml文件

stream:# 过滤开关enabled: true# 排除链接(多个用逗号分隔)excludes: /api/file/*,/api/file/upload# 匹配链接urlPatterns: /api/*

解决流只能读一次的问题,getInputStream() has already been called for this request相关推荐

  1. C# 流不可读 解决办法

    try {FileStream fs = new FileStream(sFileAllName, FileMode.OpenOrCreate,FileAccess.Write);BinaryRead ...

  2. MySQL面试三连杀:如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...

    作者 | sanyuesan0000 来源 | https://blog.csdn.net/sanyuesan0000 事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读 ...

  3. python modifysetup什么意思_##python 如何操作excel? 有米有能直接modify的,不要再推荐那些只能读或者只能写的了...

    python安装之后运行显示modify setup 你好,我想问一下,这个问题要怎么解决,我遇到了一摸一样的问题,希望不吝赐教~ python里有个math.modf(x)函数,modf是什么意思啊 ...

  4. mysql 解决了幻影读_MySQL到底能否解决幻读问题

    先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...

  5. ubuntu修改u盘权限_Ubuntu下提示U盘没有些权限的只能读不能写

    在Windows下,U盘能够正常地读写文件(能复制粘贴),但发现有个文件打不开.然后在Ubuntu LInux下,U对U盘只能读不能写.提示:Read only system. 参考:https:// ...

  6. 某手机在-20度环境下,只能读到电池温度为-18℃

    某手机在-20度环境下,只能读到电池温度为-18℃ 作者:AirCity 2020.3.1 Aircity007@sina.com 本文所有权归作者Aircity所有 问题回顾 MSM8953平台手机 ...

  7. 【十四】MySQL Innodb RR隔离级别下到底是不是解决了幻读

    我之前一直质疑网传mysql innodb的RR隔离级别下,next-key lock解决了幻读这种说法的准确性. 这次理顺了. 例子准备: 场景一.select * from user order ...

  8. 如何解决Mac只能登QQ不能联网

    如何解决Mac只能登QQ不能联网,路由正常,Wifi帐号密码正确,但wifi中断不能联网的问题. 转载于:https://www.cnblogs.com/ChenYilong/p/3756187.ht ...

  9. edis的leftpush rightpop怎么直接或者间接的解决数据库幻读的问题案例详解

    edis的左插入(leftpush)和右弹出(rightpop)操作可以间接地解决数据库幻读的问题. 幻读是指在并发事务环境中,一个事务读取到了另一个事务未提交的数据,导致错误的读取结果. edis的 ...

最新文章

  1. GPIO代码使用流程(伪代码部分示例)
  2. C/S模型UDP实现
  3. docker 不挂断创建容器
  4. leetcode-14-最长公共前缀
  5. pycharm 进行远程服务器修改与调试
  6. map容器实现一对多
  7. python拟合函数_Python-最小二乘法曲线拟合
  8. 第7章 比高斯更快的计算
  9. 「Photoshop 入门教程」了解 Photoshop 工作区
  10. 汽车系统英文缩写大全,值得收藏
  11. linux/debian安装wps以及缺失字体,亲测可用
  12. 搜狗输入法关闭快捷键设置
  13. 程序员5大热门发展行业,就业迷茫的同学注意啦!
  14. c语言tab什么意思_C语言所有的知识点干货
  15. CAD机械零件平面绘制练习七、CAD镜像命令高阶绘图练习
  16. 零基础如何学习 Web 安全?
  17. 7-224 sdut-C语言实验-排序问题7-223 sdut-C语言实验-求阶乘(循环结构)
  18. 流程图头脑风暴类软件
  19. C语言—航班订票系统
  20. 【系统分析师之路】第十一章 新技术应用

热门文章

  1. Nos项目 ChannelInfo添加SKIP和FAV的图标
  2. 冒牌网站提供假冒卡巴斯基KIS7.0下载
  3. linux下$0是什么含义,echo $? 这个东东$?在linux系统里是什么含义?
  4. vcg函数值_几个经典的数学库之一学习---VCGlib(2)
  5. 新框架(BSF_JAVA)环境部署个人总结
  6. 招聘应届毕业生的经验
  7. OBPS开发平台——导入功能整体过程
  8. 华兴数控g71外圆循环编程_G71外圆循环
  9. 解决win10笔记本睡眠一段时间后无法唤醒、自动关机的问题
  10. 距阵乘以一个未知距阵得单位矩阵 怎么算_想要定制家具?板材会选吗,知道价格怎么计算比较合理吗?...