过滤器Filter技术(请求体二次解密处理技术):

  对前端App请求进行过滤,在过滤中可以对前端请求体(body)进行二次处理,比如:前端请求的body为加密串、那么就可以在过滤器中对body加密串进行二次解密处理,再进行请求具体接口,处理逻辑如下:

  过滤器 MyFilter.java

package com.sinosoft.config;import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;/*** 使用注解标注过滤器** @author 单红宇(365384722)* @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器 属性filterName声明过滤器的名称, 可选* 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)* @myblog http://blog.csdn.net/catoop/* @create 2016年1月6日*/
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {private static final Logger LOGGER = LoggerFactory.getLogger(LogRecordAspect.class);@Overridepublic void init(FilterConfig config) throws ServletException {System.out.println("过滤器初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) request;// 防止流读取一次后就没有了, 所以需要将流继续写出去ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(httpServletRequest);String body = HttpHelper.getBodyString(requestWrapper);//如果请求Body为空异常处理if (StringUtils.isBlank(body)) {
//            LOGGER.error("非法请求, 没有APP_KEY, APP_SECRET");
            chain.doFilter(request, response);return;}//开始处理请求体try {LOGGER.info("request:" + body);Map<String, Object> parameters = new ObjectMapper().readValue(body.replaceAll("&quot;", "\""), new TypeReference<Map<String, Object>>() {});Object imReqeustEntityo = parameters.get("imReqeustEntity");if (imReqeustEntityo == null || "".equals(imReqeustEntityo)) {LOGGER.error("非法请求, 没有设备信息");} else {Map<String, String> imReqeustEntity = (Map<String, String>) imReqeustEntityo;if (imReqeustEntity == null || "".equals(imReqeustEntity)) {LOGGER.error("非法请求, 没有设备信息");}LOGGER.info("设备信息为: " + imReqeustEntity.toString());}chain.doFilter(requestWrapper, response);} catch (Exception e) {chain.doFilter(request, response);}}@Overridepublic void destroy() {System.out.println("过滤器销毁");}}

BodyReaderHttpServletRequestWrapper.java
package com.sinosoft.config;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;/*** 使用HttpServletRequestWrapper来包装HttpServletRequest* 在BodyReaderHttpServletRequestWrapper中初始化读取request的InputStream数据,以byte[]形式缓存在其中,然后在Filter中将request转换为包装过的request*/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {/*** 日志打印*/private static final Logger LOGGER = LoggerFactory.getLogger(BodyReaderHttpServletRequestWrapper.class);/*** 原加密请求体*/private final byte[] body;/*** 后解密请求体*/private final byte[] resetBody;/*** 处理request中的请求** @param request* @throws IOException*/public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);String rBody = HttpHelper.getBodyString(request);body = rBody.getBytes(Charset.forName("UTF-8"));//判断请求体是否为空
//        if (!CommonUtil.isEmpty(rBody)) {
//            LOGGER.info("开始进行AES解密处理...");
//            String aesBody = new String(body, "utf-8");
//            LOGGER.info("请求加密报文:" + aesBody);
//            AES2 aes = new AES2();
//            aesBody = aes.decrypt(aesBody);
//            resetBody = aesBody.getBytes();
//        } else {
//            resetBody = body;
//        }resetBody = body;}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}/*** 重置request中的inputStream** @return i* @throws IOException ioe*/@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(resetBody);return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}
}

HttpHelper.java
package com.sinosoft.config;import javax.servlet.ServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;/*** Created with antnest-platform* User: chenyuan* Date: 12/24/14* Time: 10:39 AM*/
public class HttpHelper {/*** 获取请求Body** @param request* @return*/public static String getBodyString(ServletRequest request) {StringBuilder sb = new StringBuilder();InputStream inputStream = null;BufferedReader reader = null;try {inputStream = request.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));String line = "";while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}return sb.toString();}}

  

转载于:https://www.cnblogs.com/xushuyi/articles/6979571.html

SpringCloud(7)—— 国寿i动项目经验之(过滤器Filter技术(请求体二次解密处理技术))...相关推荐

  1. SpringCloud(5)—— 国寿i动项目经验

    国寿i动项目经验(1) 201703初 客户提出构建国寿i动项目,开始第一次尝试解除spring boot.及spring cloud 架构,初始一点都不熟悉这种对springmvc进行二次封装的架构 ...

  2. SpringCloud(8)—— 国寿i动项目经验之(拦截器Interceptors技术)

    国寿i动项目经验之(拦截器Interceptors技术): 由于Springcloud框架是对Springmvc 进行的二次封装,可以采用面向切面的方式进行前端请求拦截,具体功能逻辑如下: WebMv ...

  3. SpringCloud(9)—— 国寿i动项目经验之(Redis缓存技术)

    国寿i动项目经验之(Redis缓存技术): 首先需要启用redis对应的jar依赖: <dependency><groupId>org.springframework.boot ...

  4. SpringCloud(10)—— 国寿i动项目经验之(解决前后端跨域请求技术)

    国寿i动项目经验之(解决前后端跨域请求技术): 由于网段原因,导致前端js请求后端服务接口出现跨域,没法实现正常的请求,所以需要对请求进行跨域处理 引入jar: <!-- 解决前后端接口交互跨域 ...

  5. 数据可视化不再难!这有一份国寿财险的实践经验

    中国人寿财险(下称国寿财险)作为财险行业信息化.数字化建设的领军企业,国寿财险已顺利完成新一代核心系统建设,拥有可支撑全数据应用场景的统一数据平台,早在2016年就开始进行车险业务流失预测建模.国寿财 ...

  6. Informatica助国寿财险升级数据分析

    文章讲的是 Informatica助国寿财险升级数据分析, "我们看重的是Informatica产品的数据处理可视化环境,运维人员可以实时监控当前的ETL运行状态,数据源共享.多机可以并行, ...

  7. android 高德地图设置不能旋转_北京实习阿里巴巴、国寿投资、小饭桌、高德软件...

    北京实习企业 阿里巴巴 国寿投资 小饭桌 高德软件 阿里巴巴 工作地点 北京/杭州/上海/成都/广州/深圳/南京/无锡 [职位1]研发工程师JAVA 工作职责: 分布式存储,搜索引擎,其他,分布式计算 ...

  8. SFB 项目经验-09-用Lync 2013或Skype for Business 2015抢火车票

    本系列博文: Lync 项目经验-01-共存迁移-Lync2013-TO-SFB 2015-规划01 http://dynamic.blog.51cto.com/711418/1858520 Lync ...

  9. 软件测试工程师简历项目经验怎么写(含真实简历)

    在写简历之前,我们先来看看失败者的简历和成功者的简历之间有什么区别.为什么成功者的简历可以在求职中起到"四两拨千斤"的作用,而失败者的简历却被丢进了垃圾桶,这两者到底有什么不同? ...

最新文章

  1. Codeforces 861 B Which floor? 思维
  2. java单例设计模式
  3. Python-day06-2018.7.9_编码以及小知识点补充
  4. AG3 hang after click membership search
  5. 1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人
  6. stm32cubemx adc_STM32CubeMX__Exp5_ADC1_2CH_DMA_TIM3_Trig__简明指导文件__jyb
  7. python2和3安装后怎样切换 mac_Mac下安装配置Python2和Python3并相互切换使用
  8. 通过案例学调优之--和 LOG BUFFER 相关的主要 Latch
  9. 新书预告<******笔记>快赏
  10. java文件虚拟路径_java虚拟路径的总结
  11. HCIE Security GRE和L2TP 备考笔记(幕布)
  12. 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
  13. hdu 1004(排序+统计)
  14. itest(爱测试) 4.3.1 发布,开源BUG 跟踪管理 amp; 敏捷测试管理软件
  15. 用python祝男朋友生日快乐_祝男朋友生日快乐的说说50句
  16. 计算机病毒为了隐藏,识别计算机病毒的方法
  17. Android热修复-Tinker简析
  18. 【读书笔记】程序员们需读的一本书《软技能:代码之外的生存指南》 | 约翰 Z.森梅兹
  19. Taro中使用WechatSI(微信同声传译)实现语音搜索
  20. C#中使用设置(Settings.settings) Properties.Settings.Default .

热门文章

  1. Python中遍历字典以及字典中的键和值
  2. 用软碟通制作U盘安装盘
  3. Python并发管理-欧阳桫-专题视频课程
  4. Minecraft 开服和 Linux 常用指令
  5. 游戏编程精粹 附带光盘
  6. 「Python」数据结构——字典和集合
  7. socket 封包和解包
  8. Visual Studio 2019 许可证过期解决办法
  9. UTD/GMT 本地时间
  10. git登录失败与自动保存密码等(Windows凭据问题)