SpringCloud(7)—— 国寿i动项目经验之(过滤器Filter技术(请求体二次解密处理技术))...
过滤器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(""", "\""), 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技术(请求体二次解密处理技术))...相关推荐
- SpringCloud(5)—— 国寿i动项目经验
国寿i动项目经验(1) 201703初 客户提出构建国寿i动项目,开始第一次尝试解除spring boot.及spring cloud 架构,初始一点都不熟悉这种对springmvc进行二次封装的架构 ...
- SpringCloud(8)—— 国寿i动项目经验之(拦截器Interceptors技术)
国寿i动项目经验之(拦截器Interceptors技术): 由于Springcloud框架是对Springmvc 进行的二次封装,可以采用面向切面的方式进行前端请求拦截,具体功能逻辑如下: WebMv ...
- SpringCloud(9)—— 国寿i动项目经验之(Redis缓存技术)
国寿i动项目经验之(Redis缓存技术): 首先需要启用redis对应的jar依赖: <dependency><groupId>org.springframework.boot ...
- SpringCloud(10)—— 国寿i动项目经验之(解决前后端跨域请求技术)
国寿i动项目经验之(解决前后端跨域请求技术): 由于网段原因,导致前端js请求后端服务接口出现跨域,没法实现正常的请求,所以需要对请求进行跨域处理 引入jar: <!-- 解决前后端接口交互跨域 ...
- 数据可视化不再难!这有一份国寿财险的实践经验
中国人寿财险(下称国寿财险)作为财险行业信息化.数字化建设的领军企业,国寿财险已顺利完成新一代核心系统建设,拥有可支撑全数据应用场景的统一数据平台,早在2016年就开始进行车险业务流失预测建模.国寿财 ...
- Informatica助国寿财险升级数据分析
文章讲的是 Informatica助国寿财险升级数据分析, "我们看重的是Informatica产品的数据处理可视化环境,运维人员可以实时监控当前的ETL运行状态,数据源共享.多机可以并行, ...
- android 高德地图设置不能旋转_北京实习阿里巴巴、国寿投资、小饭桌、高德软件...
北京实习企业 阿里巴巴 国寿投资 小饭桌 高德软件 阿里巴巴 工作地点 北京/杭州/上海/成都/广州/深圳/南京/无锡 [职位1]研发工程师JAVA 工作职责: 分布式存储,搜索引擎,其他,分布式计算 ...
- SFB 项目经验-09-用Lync 2013或Skype for Business 2015抢火车票
本系列博文: Lync 项目经验-01-共存迁移-Lync2013-TO-SFB 2015-规划01 http://dynamic.blog.51cto.com/711418/1858520 Lync ...
- 软件测试工程师简历项目经验怎么写(含真实简历)
在写简历之前,我们先来看看失败者的简历和成功者的简历之间有什么区别.为什么成功者的简历可以在求职中起到"四两拨千斤"的作用,而失败者的简历却被丢进了垃圾桶,这两者到底有什么不同? ...
最新文章
- Codeforces 861 B Which floor? 思维
- java单例设计模式
- Python-day06-2018.7.9_编码以及小知识点补充
- AG3 hang after click membership search
- 1千条数据平均分配给15人_5项数据挂零!但5犯太吓人!CBA第1狠人场均干1人
- stm32cubemx adc_STM32CubeMX__Exp5_ADC1_2CH_DMA_TIM3_Trig__简明指导文件__jyb
- python2和3安装后怎样切换 mac_Mac下安装配置Python2和Python3并相互切换使用
- 通过案例学调优之--和 LOG BUFFER 相关的主要 Latch
- 新书预告<******笔记>快赏
- java文件虚拟路径_java虚拟路径的总结
- HCIE Security GRE和L2TP 备考笔记(幕布)
- 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
- hdu 1004(排序+统计)
- itest(爱测试) 4.3.1 发布,开源BUG 跟踪管理 amp; 敏捷测试管理软件
- 用python祝男朋友生日快乐_祝男朋友生日快乐的说说50句
- 计算机病毒为了隐藏,识别计算机病毒的方法
- Android热修复-Tinker简析
- 【读书笔记】程序员们需读的一本书《软技能:代码之外的生存指南》 | 约翰 Z.森梅兹
- Taro中使用WechatSI(微信同声传译)实现语音搜索
- C#中使用设置(Settings.settings) Properties.Settings.Default .