如何使用filter过滤器对入参进行处理(完整版)
遇见的问题:
前台把参数通过报文或者使用表单、ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller里面的每一个方法里都需要进行解密处理。如果方法太多,那就太麻烦了。 设计方案:
使用过滤器,在一个Filter中将 HttpServletRequest 里的所有参数都取出来分别进行过滤然后再放回到该HttpServletRequest 中行不行呢?
通过测试后发现是不行的,因为HttpServletRequest 只提供了getParameter ,而没有提供setParameter;所以,我们只能自己写一个HttpServletRequest 方法继承HttpServletRequestWrapper,然后覆盖里面的方法,并且增加我们自己的setParameters方法,这样我们就可以为所欲为了,最后再在filter中调用该类的方法对参数进行处理(获取、修改、存储等等)。 解决方案:
在请求参数到达controller之前,在filter里面进行解密;这样,通过简单的过滤器处理,把需要处理的请求都在过滤器里进行解密操作,这样就等于实现了自动化处理。
这里我们针对两种不同的请求方式进行讲解: 普通的表单、ajax请求; json格式的报文请求。(三步搞定) 1.普通的表单、ajax请求;
第一步:新建一个类别
这个类继承自HttpServletRequestWrapper import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * 重写 HttpServletRequestWrapper * 处理表单、ajax请求 * @author zhaoheng * */ public class MyHttpServletRequestWrapper1 extends HttpServletRequestWrapper{ // 用于存储请求参数 private Map params = new HashMap(); // 构造方法 public MyHttpServletRequestWrapper1(HttpServletRequest request) throws IOException { super(request); // 把请求参数添加到我们自己的map当中 this.params.putAll(request.getParameterMap()); } /** * 添加参数到map中 * @param extraParams */ public void setParameterMap(Map extraParams) { for (Map.Entry entry : extraParams.entrySet()) { setParameter(entry.getKey(), entry.getValue()); } } /** * 添加参数到map中 * @param name * @param value */ public void setParameter(String name, Object value) { if (value != null) { System.out.println(value); if (value instanceof String[]) { params.put(name, (String[]) value); } else if (value instanceof String) { params.put(name, new String[]{(String) value}); } else { params.put(name, new String[]{String.valueOf(value)}); } } } /** * 重写getParameter,代表参数从当前类中的map获取 * @param name * @return */ @Override public String getParameter(String name) { String[]values = params.get(name); if(values == null || values.length == 0) { return null; } return values[0]; } /** * 重写getParameterValues方法,从当前类的 map中取值 * @param name * @return */ @Override public String[] getParameterValues(String name) { return params.get(name); } }
通过建立这个类我们就能完成向request对象添加我们处理之后的参数了。
第二步:通过实现filter接口建一个过滤器 package com.zhh.filter; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import com.zhh.util.request.MyHttpServletRequestWrapper1; /** * 参数处理验过滤器(针对ajax、表单等请求) 1.获取请求参数;2.对获取到的请求参数进行处理(解密、字符串替、请求参数分类截取等等);3.把处理后的参数放回到请求列表里面 * * @author zhaoheng * */ public class ValidatorFilter1 implements Filter { private static final Logger log = Logger.getLogger(ValidatorFilter1.class); /** * 需要过滤的地址 */ private static List urlList = Arrays.asList("/pastOrder/filterCsF"); /** * 是否不需要过滤 * * @param requestUrl * 请求的url * @return */ public boolean isPast(String requestUrl) { for (String url : urlList) { if (requestUrl.equals(url)) { return true; } } return false; } @Override public void destroy() { } @SuppressWarnings("unchecked") @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("过滤器2执行开始"); String url = ((HttpServletRequest) request).getRequestURI().substring(((HttpServletRequest)request).getContextPath().length()); //通过地址对特定的请求进行处理,如果不需要可以不用,如果不用,就会对使用的请求进行过滤 if (isPast(url)) { MyHttpServletRequestWrapper1 requestWrapper1 = new MyHttpServletRequestWrapper1( (HttpServletRequest) request); // 1.获取需要处理的参数 String email = requestWrapper1.getParameter("email"); // 2.把处理后的参数放回去(这里是大小转小写处理) requestWrapper1.setParameter("email", email.toLowerCase()); // 3.放行,把我们的requestWrapper1放到方法当中 chain.doFilter(requestWrapper1, response); } else { chain.doFilter(request, response); } } @Override public void init(FilterConfig arg0) throws ServletException { } }
第三步:过滤器的配置
方法一、在web.xml文件里面进行简单的配置(一般项目)
把我们的过滤器放在该文件中注册 ValidatorFilter1 com.zhh.filter.ValidatorFilter1 ValidatorFilter1 /*
方法二、springboot项目的配置
新建一个配置类,加上@Configuration注解,在方法头加上@Bean注解 @Configuration public class WebFileterConfig { /** * 配置过滤器 * order属性:控制过滤器加载顺序:数字越小,加载越早 * @return */ @Bean public FilterRegistrationBean ValidatorFilterRegistration() { //新建过滤器注册类 FilterRegistrationBean registration = new FilterRegistrationBean(); // 添加我们写好的过滤器 registration.setFilter( new ValidatorFilter1()); // 设置过滤器的URL模式 registration.addUrlPatterns("/*"); registration.setOrder(Integer.MAX_VALUE-10); return registration; } }
controller 接收参数代码: /** * 过滤方法测试 */ @RequestMapping("/filterCsF2") public void filterCs22(String email,String userName){ System.out.println("处理后的参数:"+userName+" "+email); }
请求示例代码: 请求demo
处理结果: 处理后的参数:21088888 zhaoheng@163.com
从结果可以看出,我们成功地通过过滤器对请求的email进行大写转小写处理 2.json格式的报文请求;
第一步:新建一个类别
这个类继承自HttpServletRequestWrapper package com.zhh.util.request; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import jodd.io.StreamUtil; /** * 重写 HttpServletRequestWrapper * 处理json报文请求 * @author zhaoheng * */ public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper{ private byte[] body; //用于保存读取body中数据 public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); //读取请求的数据保存到本类当中 body = StreamUtil.readBytes(request.getReader(), "UTF-8"); } //覆盖(重写)父类的方法 @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } //覆盖(重写)父类的方法 @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } }; } /** * 获取body中的数据 * @return */ public byte[] getBody() { return body; } /** * 把处理后的参数放到body里面 * @param body */ public void setBody(byte[] body) { this.body = body; } }
通过建立这个类我们就能完成向request对象添加我们处理之后的参数了。
第二步:通过实现filter接口建一个过滤器 package com.zhh.filter; import java.io.BufferedReader; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.zhh.util.request.MyHttpServletRequestWrapper; /** * 参数校验过滤器(针对json报文请求) 1.获取请求参数;2.对获取到的请求参数进行处理(解密、字符串替、请求参数分类截取等等);3.把处理后的参数放回到请求列表里面 * * @author zhaoheng * */ public class ValidatorFilter implements Filter { private static final Logger log = Logger.getLogger(ValidatorFilter.class); /** * 需要过滤的地址 */ private static List urlList = Arrays.asList("/pastOrder/filterCs"); /** * 是否需要过滤 * * @param requestUrl * 请求的url * @return */ public boolean isPast(String requestUrl) { for (String url : urlList) { if (requestUrl.equals(url)) { return true; } } return false; } @Override public void destroy() { log.info("过滤器执行结束"); } @SuppressWarnings("unchecked") @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("过滤器1执行开始"); String url0 = ((HttpServletRequest) request).getRequestURI(); String url1 = ((HttpServletRequest) request).getContextPath(); System.out.println("完整地址:"+url0); System.out.println("返回当前页面所在的应用的名字:"+url1); System.out.println("返回当前页面所在的应用的名字长度:"+url1.length()); // 获取请求地址 String url = ((HttpServletRequest) request).getRequestURI().substring(((HttpServletRequest)request).getContextPath().length()); System.out.println("截取后的地址:"+url); if (isPast(url)) { //处理json报文请求 MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper( (HttpServletRequest) request); // 读取请求内容 BufferedReader br; br = requestWrapper.getReader(); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } // 将json字符串转换为json对象 JSONObject jsonObject = JSONObject.parseObject(sb.toString()); Map map = new HashMap(); // 把json对象转换为Map集合 map = JSON.toJavaObject(jsonObject, Map.class); for (Entry entry : map.entrySet()) { // 把邮箱地址转换为小写 if (entry.getKey().equals("email")) { map.put(entry.getKey(), entry.getValue().toString() .toLowerCase()); } } // 把参数转换之后放到我们的body里面 String json = JSON.toJSONString(map); requestWrapper.setBody(json.getBytes("UTF-8")); // 放行 chain.doFilter(requestWrapper, response); } else { chain.doFilter(request, response); } } @Override public void init(FilterConfig arg0) throws ServletException { } }
第三步:
方法一、在web.xml文件里面进行简单的配置
把我们的过滤器放在该文件中注册 ValidatorFilter com.zhh.filter.ValidatorFilter ValidatorFilter /*
方法二、springboot项目的配置
新建一个配置类,加上@Configuration注解,在方法头加上@Bean注解 @Configuration public class WebFileterConfig { /** * 配置过滤器 * order属性:控制过滤器加载顺序:数字越小,加载越早 * @return */ @Bean public FilterRegistrationBean ValidatorFilterRegistration() { //新建过滤器注册类 FilterRegistrationBean registration = new FilterRegistrationBean(); // 添加我们写好的过滤器 registration.setFilter( new ValidatorFilter()); // 设置过滤器的URL模式 registration.addUrlPatterns("/*"); registration.setOrder(Integer.MAX_VALUE-10); return registration; } }
controller 接收参数代码: /** * 过滤方法测试 * @RequestBody User user 该注解用于接收json请求的参数 * @return */ @ResponseBody @RequestMapping(value = "/filterCs") public User filterCs(@RequestBody User user){ System.out.println(user.toString()); return user; }
请求报文示例:
我这里使用的是postman工具进行json参数请求 { "email": "zhaoHENG@163.com", "userName":"20181100", "age":"18" }
返回结果: { "email": "zhaoheng@163.com", "userName":"20181100", "age":"18" }
通过该过滤器,把email转换从小写成功。
通过以上操作,我们就成功的创建了一个过滤器。 感谢阅读,希望对你有所帮助 :)
来源:blog.csdn.net/Muscleheng/article/details/80067772
人机物三元融合万物智能互联来源经济日报随着物联网和人工智能等高新技术的发展和应用,人机物融合的相关研究引起世界普遍关注。习近平总书记在两院院士大会中国科协第十次全国代表大会上指出,以信息技术人工智能为代表的
高端没了华为,苹果风刮过,国内一个剩下的都没有年末已经到了。经历了多轮制裁以后的华为已经彻底在手机市场上逐渐消失了。当初华为还在的时候,国内的诸多大厂都帮忙华为宣传,说它打爱国牌。然后心里暗自嘀咕,不就是正好站在了风口上吗?要
全媒体运营师是做什么的?先来说说什么是全媒体运营师全媒体运营师指综合利用各种媒介技术和渠道,采用数据分析创意策划等方式,从事对信息进行加工匹配分发传播反馈等工作的人员。全媒体运营师的主要工作任务1。运用网
springboot封装阿里云(OSS)文件上传登录你阿里云,找到你OSS服务,很便宜。如何找到一下参数,自行搜索其他文章额pom文件!OSS各个项目单独加依赖,根据需要进行添加dependencygroupIdcom。aliy
助听器能左右耳佩戴吗?助听器有几种类型的,如果是简单的模拟助听器,是不区分左右耳,两侧都是可以直接佩戴的。不过现在主流市场的助听器都是数字助听器,是要测试听损患者的听力损失,根据听力损失和听觉反映调试助
助听器跟人工耳蜗买哪一个好,你怎么看?从本质上来说都是辅听装置,助听器是利用残余听力,而人工耳蜗是重建听力,效果对比来说没有具体定论,一般是助听器没效果才考虑人工耳蜗。人工耳蜗是价格比较高,并且是手术植入电极,有一定风
听力不好一直不带助听器会有什么后果?及时戴上助听器保护残留的听力,不带助听器大脑长时间得不到声音的刺激处于长期睡眠状态,功能就会慢慢地退化,反应也就会越来越差,言语分辨率也会下降,也就是用足够大的声音能听到声音,却听
长期戴助听器的人耳道是会大一点的吗?有这个可能,人耳道的皮肤会渐渐松弛,长期佩戴定制机在耳内,时间久了耳道会有一点点支撑起来的变化。会有这个可能的,长期佩戴定制机在耳内,时间久了耳道会有一点点支撑起来的变化。有这个可
中国航天这么强我们老百姓能得到什么实惠?吃,你吃到了实惠。种子上天再下地,你吃到了上天和天上的食品。这是实惠吧?算吗?航天一般的国家没有这个实力,较強旺的国家才搞得起,表示強大。国家強大了在各个方面都较硬棒。老百姓在強硬
乞丐版iPhone重出江湖,128G上线降3100元,多少人等到了?感谢您的阅读!我们在官网上看到目前最便宜的iPhone手机就是iPhoneSE2020。这款iPhone手机64GB版本,目前的价格是3299,当然在一些平台它的价格会更便宜一些。
为什么同样质量淘宝比拼多多贵很多,同样价格淘宝比京东质量差?他们是个大家庭,别无脑黑,各自的销售套路不同罢了。有幸给拼多多客户加工过衣服,拿淘宝的爆版改,刚开始差不多尺寸,稍微有点销量了,商家会要求改薄点改轻点,然后没多久再要求改薄点改轻点
为何这些车型能够畅销全球,幕后的那些历史你又能懂多少?汽车的发展已经走过了百多年的时间,从诞生开始至今,全球已经拥有多个不同的品牌和车型,人们对汽车的需求似乎越来越大,在选择汽车时可以用琳琅满目来形容。但是你可要知道,有几款车在汽车发
试驾丨细节见真章,东风悦达起亚嘉华做得如何?随着三胎政策的开放,不少消费者重新开始审视车辆空间性功能性的真正价值体现,因为无论是否真有多孩计划,政策开放对于向来有未雨绸缪思想的中国用户来说,都已经成为改变购车思维的关键因素。
关于打印机5页面覆盖率的那些事在购买打印机耗材时,我们最在意的就是一支硒鼓墨盒能够打印文件的数量,据悉一支标准的硒鼓墨盒能够打印2000页A4纸。相信你一定会产生疑问为什么手中的硒鼓墨盒打印不到2000页就提示
5G延迟为什么加快网络速度很重要StephenShankland,SharaTibken当您查看移动网络或家庭宽带时,您知道检查应用程序下载和视频上传的数据速度很重要。您可能不知道的是,称为延迟的更模糊的速度测量
为什么别人的电脑没有什么广告,而你的电脑一大堆呢?答案在这里相信大家都有过这样的经历,每次将电脑正常开机后,在加载桌面的那个环节或者我们平时正常使用的时候,桌面上总是会出现一大堆的广告,而且就算我们手动去关闭这些广告,下一次或者过几天又会弹
儿子的高考前后(6)抱手机怎么办?抱电脑怎么办?自填报完志愿之后,他极少到外面出去玩,一整天呆在屋里抱手机抱电脑。抱手机时据我观察应该是微信聊天占二成时间,看动画片占三成时间,玩游戏占五成时间抱电脑(刚买的猎人游戏本)时完全是玩
Belden发布电缆连接及软件等系列新品Belden的BeldenDataTuffCat6A高柔性工业以太网电缆近日,专业网络平台的全球供应商Belden宣布的2021年第三季度新产品发布,其将继续为客户提供更多选择,以
物理学家创造了世界上最精确的中子寿命测量一个国际研究小组对中子的寿命进行了世界上最精确的测量,这可能有助于回答有关早期宇宙的问题。由印第安纳大学布卢明顿分校的研究人员领导的一个国际物理学家小组宣布了世界上最精确的中子寿命
周朝阳备份文件,U盘硬盘网盘哪个好备份就是对电脑里面所有的文件进行梳理,之后分成三份,分别拷贝到机械硬盘,U盘和网盘里面进行备份。之前我的一台笔记本用了7年,使用的过程中活还没有干完就坏了,主板的问题,很多一些资料
当代摄影师赚钱技能学不会烧钱装备一大堆每个月,你最期盼的东西是什么呢?是满月的光辉?是归家的心愿?还是让日盼夜盼的工资呢?然而千辛万苦痴痴等待的工资刚到手却被安排的明明白白的,尤其是摄影人,烧钱比赚钱快,真的太难了。都
赚钱技能学不会烧钱装备一大堆这3款镜头值得买吗?距离你发工资,还有多少天呢?发了工资,你有什么计划呢?对于摄影人来说,工资,是一样被安排的明明白白的东西,难,真的是太难了。摄影人的工资却显得那么的卑微,为什么?因为太烧钱了啊!布