城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

如何使用filter过滤器对入参进行处理(完整版)

5月21日 飞凤谷投稿
  遇见的问题:
  前台把参数通过报文或者使用表单、ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller里面的每一个方法里都需要进行解密处理。如果方法太多,那就太麻烦了。设计方案:
  使用过滤器,在一个Filter中将HttpServletRequest里的所有参数都取出来分别进行过滤然后再放回到该HttpServletRequest中行不行呢?
  通过测试后发现是不行的,因为HttpServletRequest只提供了getParameter,而没有提供setP所以,我们只能自己写一个HttpServletRequest方法继承HttpServletRequestWrapper,然后覆盖里面的方法,并且增加我们自己的setParameters方法,这样我们就可以为所欲为了,最后再在filter中调用该类的方法对参数进行处理(获取、修改、存储等等)。解决方案:
  在请求参数到达controller之前,在filter里面进行解密;这样,通过简单的过滤器处理,把需要处理的请求都在过滤器里进行解密操作,这样就等于实现了自动化处理。
  这里我们针对两种不同的请求方式进行讲解:普通的表单、ajax请求;json格式的报文请求。(三步搞定)1。普通的表单、ajax请求;
  第一步:新建一个类别
  这个类继承自HttpServletRequestWrapperimportjava。io。IOEimportjava。util。HashMimportjava。util。Mimportjavax。servlet。http。HttpServletRimportjavax。servlet。http。HttpServletRequestW重写HttpServletRequestWrapper处理表单、ajax请求authorzhaohengpublicclassMyHttpServletRequestWrapper1extendsHttpServletRequestWrapper{用于存储请求参数privateMapString,String〔〕paramsnewHashMapString,String〔〕();构造方法publicMyHttpServletRequestWrapper1(HttpServletRequestrequest)throwsIOException{super(request);把请求参数添加到我们自己的map当中this。params。putAll(request。getParameterMap());}添加参数到map中paramextraParamspublicvoidsetParameterMap(MapString,ObjectextraParams){for(Map。EntryString,Objectentry:extraParams。entrySet()){setParameter(entry。getKey(),entry。getValue());}}添加参数到map中paramnameparamvaluepublicvoidsetParameter(Stringname,Objectvalue){if(value!null){System。out。println(value);if(valueinstanceofString〔〕){params。put(name,(String〔〕)value);}elseif(valueinstanceofString){params。put(name,newString〔〕{(String)value});}else{params。put(name,newString〔〕{String。valueOf(value)});}}}重写getParameter,代表参数从当前类中的map获取paramnamereturnOverridepublicStringgetParameter(Stringname){String〔〕valuesparams。get(name);if(valuesnullvalues。length0){}returnvalues〔0〕;}重写getParameterValues方法,从当前类的map中取值paramnamereturnOverridepublicString〔〕getParameterValues(Stringname){returnparams。get(name);}}
  通过建立这个类我们就能完成向request对象添加我们处理之后的参数了。
  第二步:通过实现filter接口建一个过滤器packagecom。zhh。importjava。io。IOEimportjava。util。Aimportjava。util。Limportjavax。servlet。Fimportjavax。servlet。FilterCimportjavax。servlet。FilterCimportjavax。servlet。ServletEimportjavax。servlet。ServletRimportjavax。servlet。ServletRimportjavax。servlet。http。HttpServletRimportorg。apache。log4j。Limportcom。zhh。util。request。MyHttpServletRequestWrapper1;参数处理验过滤器(针对ajax、表单等请求)1。获取请求参数;2。对获取到的请求参数进行处理(解密、字符串替、请求参数分类截取等等);3。把处理后的参数放回到请求列表里面authorzhaohengpublicclassValidatorFilter1implementsFilter{privatestaticfinalLoggerlogLogger。getLogger(ValidatorFilter1。class);需要过滤的地址privatestaticListStringurlListArrays。asList(pastOrderfilterCsF);是否不需要过滤paramrequestUrl请求的urlreturnpublicbooleanisPast(StringrequestUrl){for(Stringurl:urlList){if(requestUrl。equals(url)){}}}Overridepublicvoiddestroy(){}SuppressWarnings(unchecked)OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{log。info(过滤器2执行开始);Stringurl((HttpServletRequest)request)。getRequestURI()。substring(((HttpServletRequest)request)。getContextPath()。length());通过地址对特定的请求进行处理,如果不需要可以不用,如果不用,就会对使用的请求进行过滤if(isPast(url)){MyHttpServletRequestWrapper1requestWrapper1newMyHttpServletRequestWrapper1((HttpServletRequest)request);1。获取需要处理的参数StringemailrequestWrapper1。getParameter(email);2。把处理后的参数放回去(这里是大小转小写处理)requestWrapper1。setParameter(email,email。toLowerCase());3。放行,把我们的requestWrapper1放到方法当中chain。doFilter(requestWrapper1,response);}else{chain。doFilter(request,response);}}Overridepublicvoidinit(FilterConfigarg0)throwsServletException{}}
  第三步:过滤器的配置
  方法一、在web。xml文件里面进行简单的配置(一般项目)
  把我们的过滤器放在该文件中注册!配置过滤器filterfilternameValidatorFilter1filtername!我们写的过滤的地址filterclasscom。zhh。filter。ValidatorFilter1filterclassfilterfiltermappingfilternameValidatorFilter1filternameurlpatternurlpatternfiltermapping
  方法二、springboot项目的配置
  新建一个配置类,加上Configuration注解,在方法头加上Bean注解ConfigurationpublicclassWebFileterConfig{配置过滤器order属性:控制过滤器加载顺序:数字越小,加载越早returnBeanpublicFilterRegistrationBeanValidatorFilterRegistration(){新建过滤器注册类FilterRegistrationBeanregistrationnewFilterRegistrationBean();添加我们写好的过滤器registration。setFilter(newValidatorFilter1());设置过滤器的URL模式registration。addUrlPatterns();registration。setOrder(Integer。MAXVALUE10);}}
  controller接收参数代码:过滤方法测试RequestMapping(filterCsF2)publicvoidfilterCs22(Stringemail,StringuserName){System。out。println(处理后的参数:userNameemail);}
  请求示例代码:!DOCTYPEhtmlPUBLICW3CDTDXHTML1。0TransitionalENhttp:www。w3。orgTRxhtml1DTDxhtml1transitional。dtdhtmlxmlnshttp:www。w3。org1999xhtmlheadmetahttpequivContentTcharsetutf8title请求demotitleheadbodybodyhtml
  处理结果:处理后的参数:21088888zhaoheng163。com
  从结果可以看出,我们成功地通过过滤器对请求的email进行大写转小写处理2。json格式的报文请求;
  第一步:新建一个类别
  这个类继承自HttpServletRequestWrapperpackagecom。zhh。util。importjava。io。BufferedRimportjava。io。ByteArrayInputSimportjava。io。IOEimportjava。io。InputStreamRimportjavax。servlet。ServletInputSimportjavax。servlet。http。HttpServletRimportjavax。servlet。http。HttpServletRequestWimportjodd。io。StreamU重写HttpServletRequestWrapper处理json报文请求authorzhaohengpublicclassMyHttpServletRequestWrapperextendsHttpServletRequestWrapper{privatebyte〔〕用于保存读取body中数据publicMyHttpServletRequestWrapper(HttpServletRequestrequest)throwsIOException{super(request);读取请求的数据保存到本类当中bodyStreamUtil。readBytes(request。getReader(),UTF8);}覆盖(重写)父类的方法OverridepublicBufferedReadergetReader()throwsIOException{returnnewBufferedReader(newInputStreamReader(getInputStream()));}覆盖(重写)父类的方法OverridepublicServletInputStreamgetInputStream()throwsIOException{finalByteArrayInputStreambaisnewByteArrayInputStream(body);returnnewServletInputStream(){Overridepublicintread()throwsIOException{returnbais。read();}};}获取body中的数据returnpublicbyte〔〕getBody(){}把处理后的参数放到body里面parambodypublicvoidsetBody(byte〔〕body){this。}}
  通过建立这个类我们就能完成向request对象添加我们处理之后的参数了。
  第二步:通过实现filter接口建一个过滤器packagecom。zhh。importjava。io。BufferedRimportjava。io。IOEimportjava。util。Aimportjava。util。HashMimportjava。util。Limportjava。util。Mimportjava。util。Map。Eimportjavax。servlet。Fimportjavax。servlet。FilterCimportjavax。servlet。FilterCimportjavax。servlet。ServletEimportjavax。servlet。ServletRimportjavax。servlet。ServletRimportjavax。servlet。http。HttpServletRimportorg。apache。log4j。Limportcom。alibaba。fastjson。JSON;importcom。alibaba。fastjson。JSONOimportcom。zhh。util。request。MyHttpServletRequestW参数校验过滤器(针对json报文请求)1。获取请求参数;2。对获取到的请求参数进行处理(解密、字符串替、请求参数分类截取等等);3。把处理后的参数放回到请求列表里面authorzhaohengpublicclassValidatorFilterimplementsFilter{privatestaticfinalLoggerlogLogger。getLogger(ValidatorFilter。class);需要过滤的地址privatestaticListStringurlListArrays。asList(pastOrderfilterCs);是否需要过滤paramrequestUrl请求的urlreturnpublicbooleanisPast(StringrequestUrl){for(Stringurl:urlList){if(requestUrl。equals(url)){}}}Overridepublicvoiddestroy(){log。info(过滤器执行结束);}SuppressWarnings(unchecked)OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{log。info(过滤器1执行开始);Stringurl0((HttpServletRequest)request)。getRequestURI();Stringurl1((HttpServletRequest)request)。getContextPath();System。out。println(完整地址:url0);System。out。println(返回当前页面所在的应用的名字:url1);System。out。println(返回当前页面所在的应用的名字长度:url1。length());获取请求地址Stringurl((HttpServletRequest)request)。getRequestURI()。substring(((HttpServletRequest)request)。getContextPath()。length());System。out。println(截取后的地址:url);if(isPast(url)){处理json报文请求MyHttpServletRequestWrapperrequestWrappernewMyHttpServletRequestWrapper((HttpServletRequest)request);读取请求内容BufferedRbrrequestWrapper。getReader();SStringBuildersbnewStringBuilder();while((linebr。readLine())!null){sb。append(line);}将json字符串转换为json对象JSONObjectjsonObjectJSONObject。parseObject(sb。toString());MapString,ObjectmapnewHashMapString,Object();把json对象转换为Map集合mapJSON。toJavaObject(jsonObject,Map。class);for(EntryString,Objectentry:map。entrySet()){把邮箱地址转换为小写if(entry。getKey()。equals(email)){map。put(entry。getKey(),entry。getValue()。toString()。toLowerCase());}}把参数转换之后放到我们的body里面StringjsonJSON。toJSONString(map);requestWrapper。setBody(json。getBytes(UTF8));放行chain。doFilter(requestWrapper,response);}else{chain。doFilter(request,response);}}Overridepublicvoidinit(FilterConfigarg0)throwsServletException{}}
  第三步:
  方法一、在web。xml文件里面进行简单的配置
  把我们的过滤器放在该文件中注册!配置过滤器filterfilternameValidatorFilterfiltername!我们写的过滤的地址filterclasscom。zhh。filter。ValidatorFilterfilterclassfilterfiltermappingfilternameValidatorFilterfilternameurlpatternurlpatternfiltermapping
  方法二、springboot项目的配置
  新建一个配置类,加上Configuration注解,在方法头加上Bean注解ConfigurationpublicclassWebFileterConfig{配置过滤器order属性:控制过滤器加载顺序:数字越小,加载越早returnBeanpublicFilterRegistrationBeanValidatorFilterRegistration(){新建过滤器注册类FilterRegistrationBeanregistrationnewFilterRegistrationBean();添加我们写好的过滤器registration。setFilter(newValidatorFilter());设置过滤器的URL模式registration。addUrlPatterns();registration。setOrder(Integer。MAXVALUE10);}}
  controller接收参数代码:过滤方法测试RequestBodyUseruser该注解用于接收json请求的参数returnResponseBodyRequestMapping(valuefilterCs)publicUserfilterCs(RequestBodyUseruser){System。out。println(user。toString());}
  请求报文示例:
  我这里使用的是postman工具进行json参数请求{email:zhaoHENG163。com,userName:20181100,age:18}
  返回结果:{email:zhaoheng163。com,userName:20181100,age:18}
  通过该过滤器,把email转换从小写成功。
  通过以上操作,我们就成功的创建了一个过滤器。感谢阅读,希望对你有所帮助:)
  来源:blog。csdn。netMusclehengarticledetails80067772
投诉 评论 转载

如何使用filter过滤器对入参进行处理(完整版)遇见的问题:前台把参数通过报文或者使用表单、ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller里面的每一个方法里都需要进行解密处理。如果方法太……两三分钟一集,收费一元起!刷抖音快手也要付费了?这年头,刷个短视频都要付费了。近日,据界面新闻、潇湘晨报等多家媒体报道,有消息表示,抖音正在测试短剧付费功能。据了解,抖音短剧的付费模式与付费小说类似,是按集数进行付费,……这份Redis使用规范,拿走不谢在公司项目中,redis属于高频使用,在使用中,我们遇到了各种各样的redis问题,于是针对自身情况梳理了一个redis使用规范。一、键名设计1、key名设计1。禁止包含……明珠货运与极兔签署物流合作协议近日,明珠货运控股有限公司(YGMZ。US)(以下简称明珠货运)宣布与极兔国际物流有限公司(以下简称极兔物流)签署货物运输协议,双方就建立长期运输业务合作关系达成共识。根据协议……工业智能网关是做什么的及典型应用场景?工业智能网关叫什么?工业智能网关也叫工业物联网智能网关、无线数据采集网关、通讯采集网关,PLC无线网关,工业通讯网关,属于无线传感器网络产品。工业智能网关是一款具备挖掘工……今日区块链资讯1。2月3日消息,在经历多年对数字货币摇摆不定的立场之后,印度财政部长西塔拉曼当地时间2月1日表示,印度计划在今年4月份开始的2023财年推出央行数字货币。西塔拉曼说,政府决定……曝硬件可圈可点小米12Ultra,小米11彻底失宠,降到冰点曝光将于2022年5月10日正式闪亮登场小米12Ultra作为最强影像旗舰,曝光将于2022年5月10日正式闪亮登场小米12Ultra自然不会错过120瓦超级快充,曝光将于20……DAMA第一章数据管理数据管理的核心驱动因素数据管理的核心驱动力在于组织通过数据资产管理获得商业价值。关键在于拥有高质量、可靠性的数据做支撑。数据管理的目标数据安全数据质量元数据……员工发生工伤,公司应当承担哪些费用?前段时间,《人物》杂志公众号的一篇文章《外卖骑手,困在系统里》,刷屏了大家的朋友圈,一系列交警部门公布的数据背后,外卖员已成高危职业的话题引发了大家新一轮的思考。1、骑手……自动驾驶汽车还需要驾照吗太阳能板可以给新能源汽车充电,太阳能电池板经过逆变器可以输出220V交流电压,理论上有了220V电源后就可以为电动汽车充电,但是充电功率非常小,充电器可能无法工作,或者充电慢、……让飞羽触手可及佳能RF800mmF5。6LISUSM2022年2月,佳能正式发布了两款重量级长焦镜头RF800mmF5。6LISUSM和RF1200mmF8LISUSM,预计5月下旬正式开售。赶上了北京的早春,用这支轻量化与高画……2021诺贝尔化学奖揭晓,欧盟将指控苹果NFC垄断1、苹果为AirPods2ProMax推送4A400固件:支持FindMy查找功能(IT之家)10月6日消息,根据外媒MacRumors消息,苹果已经为AirPods2、……
陡降型听损的人助听器要怎么选配才能效果好?安吉尔A7Pro大水量净水器荣获2021中国家用电器产品创新马化腾的微信会没落吗,可能会被什么软件取代?现在的人都在搞视频创作,那实体行业的发展由谁负责?敢和苹果叫板,ThinkPadX1新品有多能打?网友很快就知云南一男子因网络问题向县长反映村里没网,女朋友都跑了传英伟达RTX3090SUPER显卡拥有10752个CUDA疯狂!巴斯夫帝斯曼科莱恩等再涨价,最高涨8500心血管专家提醒三伏天,老人注意这3件事不要做,以防危险发生安全带提示或存问题特斯拉召回汽车81。7万辆康师傅回应老坛酸菜面重新上架涉及插旗产品已全部下架今晚8点,谁改变了双11的游戏规则
感恩母爱小学生的作文400字热闻聚热点网 《大风歌》原文翻译,《大风歌》作者简介写作背景大班保育的工作总结好想再吃一次,小时候那种味道的烤山药卡尔达诺(ADA)最近几天反弹的背后原因是什么?喝啤酒过敏了男人这时该怎么办?五桂山的村庄千变万化的文学华硕N550J怎么样?华硕N550J好用吗?小学四年级寒假日记作文四篇唯美伤感情话无花果快速生根法

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁