之前突发奇想通过过滤器和拦截器把前端的请求数据拦截下来然后做些验证和过滤再到contrlller层做业务逻辑,就尝试着把请求中的json(到了httprequest类里是 输入流数据),拦截下来验证,but有个问题,就是spring boot  httprequest 的getInputStream调用一次获取输入流后就再次调用就会获取为空。so搞了几天,现在分享下解决方案。

一: 配置

spring boot  简化了原本spring mvc 的xml配置,配置上简易了很多。下面简略的阐述下步骤

配置拦截器    @Configuration  表示这个是一个配置类  继承WebMvcConfigurerAdapter 并重写addInterceptors 方法就可以实现拦截器配置

@Configuration
public class InterceptorConfigurer extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则// excludePathPatterns 用户排除拦截// 验证字符registry.addInterceptor(new SpecialCharacterInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/sendToOneNormal")// Im发送.excludePathPatterns("/api/sendToGroupNormal");// Im发送// 验证sql注入registry.addInterceptor(new SQLInjectionInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/saveFormAttr")// 表单设计保存.excludePathPatterns("/api/sendToOneNormal")// Im发送.excludePathPatterns("/api/sendToGroupNormal");// Im发送// registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");super.addInterceptors(registry);}
}

过滤器配置

@Configuration
public class FilterConfiguration {/*** 配置过滤器* @return*/@Beanpublic FilterRegistrationBean someFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(SealFilter());registration.addUrlPatterns("/*");registration.addInitParameter("paramName", "paramValue");registration.setName("SealFilter");return registration;}/*** 创建一个bean* @return*/@Bean(name = "SealFilter")public Filter SealFilter() {return new SealFilter();}
}

二  过滤器实现重新封装 输入流

 @Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// TODO Auto-generated method stubServletRequest requestWrapper = null;    if(request instanceof HttpServletRequest) { //判断是否是http请求 requestWrapper = new MAPIHttpServletRequestWrapper((HttpServletRequest) request); //再封装request}    if(requestWrapper == null) {    chain.doFilter(request, response);    } else {    chain.doFilter(requestWrapper, response);    }}
public class MAPIHttpServletRequestWrapper extends HttpServletRequestWrapper {private final byte[] body; // 报文final static int BUFFER_SIZE = 4096;public MAPIHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);body = InputStreamTOByte(request.getInputStream()); //读取输入流} @Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body); //再封装数据return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean isReady() {// TODO Auto-generated method stubreturn false;}@Overridepublic void setReadListener(ReadListener readListener) { //在这里配置读取监听  可以使用这个方法限制读取次数// TODO Auto-generated method stub}};}public static byte[] InputStreamTOByte(InputStream in) throws IOException {ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] data = new byte[BUFFER_SIZE];int count = -1;while ((count = in.read(data, 0, BUFFER_SIZE)) != -1)outStream.write(data, 0, count);data = null;return outStream.toByteArray();}}

通过重写 HttpServletRequestWrapper以及过滤器,再封装数据便于拦截器读取数据进行处理,从而规避了HttpServletRequestWrapper的输入流只能读取一次的问题。

spring boot对json 输入流数据拦截分析处理相关推荐

  1. Spring Boot处理JSON数据

    Spring Boot处理JSON数据 在Spring Boot的Web应用中,内置JSON数据解析功能,默认使用Jackson自动解析,不需要加载Jackson依赖包,当控制器返回一个Java对象或 ...

  2. 利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细

    在Spring Boot的Web应用中 内置了JSON数据的解析功能,默认使用Jackson自动完成解析(不需要解析加载Jackson依赖包)当控制器返回一个Java对象或集合数据时 Spring B ...

  3. Spring Boot干货系列:数据存储篇-SQL关系型数据库之MyBatis的使用

    Spring Boot干货系列:数据存储篇-SQL关系型数据库之MyBatis的使用 前言 上篇我们介绍了Spring Boot对传统JdbcTemplate的集成,这次换一下,介绍下Spring B ...

  4. Spring Boot(5) web开发(3)拦截器、文件上传、异常处理

    Spring Boot(5) web开发(3)拦截器.文件上传.异常处理 学习视频: https://www.bilibili.com/video/BV19K4y1L7MT?p=49&spm_ ...

  5. spring boot 中json数据处理

    spring boot获取json数据,使用@RequestBody JSONObject jsonParma注解,获取数据用jsonParma.getString方法 String类型转int使用I ...

  6. Spring Boot中前后端传递数据方式

    Spring Boot中前后端传递数据方式 postman作为客户端 目前前后端分离开发中用到的最流行的的参数格式是application/x-www-form-urlencoded和applicat ...

  7. Spring Boot实战:过滤器、拦截器与切片

    Spring Boot实战:过滤器.拦截器与切片 Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Se ...

  8. Python爬虫笔记——分析AJAX传递的JSON获取数据-初步分析动态网页

    转载文章链接: Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1) [4]实战:爬取动态网页的两种思路爬取新浪趣图(1) [5]实战:爬取动态网页的两种思路爬取新浪趣图(2) ...

  9. Spring Boot 返回 JSON 数据,一分钟搞定!

    在 WEB 项目中返回 JSON 数据是常见的交互形式,在 Spring Boot 中这一切都变得十分简单.So easy!!! 你所需具备的基础 什么是 Spring Boot? Spring Bo ...

最新文章

  1. 大数据处理——Hadoop解析(一)
  2. 使用Guava对并发应用程序进行基于对象的微锁定
  3. 解决Div自适应高度的方法(转)
  4. 软件oem要注意什么_英语配音学习要注意什么?配音的注意事项有什么?
  5. idea maven列表有问题的
  6. Tesseract-OCR识别中文与训练字库实例
  7. 联想服务器如何进入pe系统,如何制作支持Legacy BIOS和UEFI BIOS两种模式启动的Windows PE...
  8. rtmp直播相关的开源项目
  9. PC批量转换网易ncm音乐
  10. WPS插件开发流程(1)
  11. Lightbox图片展示特效
  12. “没有存在感”是一种什么感受?
  13. python中take函数_Python Pandas Series.take()用法及代码示例
  14. 做一个业务中台你到底会踩多少坑?
  15. 连接GitHub提示远程主机关闭连接
  16. asterisk拨号规则(包含匹配规则说明)转
  17. 主张:男人害怕的30种女人(zt)
  18. 软件工程资料 - UCSD 怎么教软件工程
  19. SAP BASIS经验书
  20. 2020-06-08

热门文章

  1. Google Earth Engine(GEE)——基于MODIS影像的海上漏油时间序列趋势分析(15000字长文)
  2. 【模型复现】逆合成预测/文本分类模型——MeGAN 快速复现
  3. 054-java多线程应用(雷电大战小游戏)
  4. xp系统更改计算机名BIOS设置,电脑安装XP系统的前Bios设置
  5. 最新新闻:电商黑色产业链 贩卖手机验证码刷销量
  6. 计算机组装与维修教学反思,计算机组装维护课程教学反思.doc
  7. 单片机黑屏怎么回事儿_逻辑板损坏后常见的故障现象有黑屏
  8. 网页div转换成图片导出——html2canvas
  9. ORACLE 11G中的ADR介绍:
  10. 【OCP学习1z0-052记录13】【ORACLE 11G】 ADR之problems和incidents (问题和事件)