安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

如何使用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、……
警方通报阿里女员工被侵害案,处理结果令人意外,怎么理解?小时购京东到家年货消费轻指南春节消费方式的新演绎MIUI12。5稳定版第二批开始推送,这16款手机皆可升级,泰捷WEBOXT1,千元投影会有怎么样的声画体验?发改委力挺居住社区充电桩建设新能源车家充难题将破解?听听专家孟晚舟担任华为轮值董事长权利有多大?拍照效果出色,追剧玩游戏过瘾!vivoX70Pro全面体验分沃尔沃出了王炸Polestar,战略很OK产品有戏吗?科普NFT到底是什么?又一种电商新零售腾讯阿里和京东争相入局,是风口还是风险?iPhone139月14日上市,这四方面的升级,还是非常有诚柳传志事件会怎么收场?可怜的流浪狗五年级日记小学生英语作文带翻译爸爸的生日Dadsbirthday为什么现在一些国产剧不看字幕,都听不清楚演员在说什么?难道是华为P30系列国行发布会4月11日举行,3月27日手机开启预分娩方式:什么是水中分娩南车怎么样(中国南车集团)八年级下学期数学教学总结来朝鲜旅行,一种给游客看的农村,一种给当地人住的农村一个资深会计对公司老板们的忠告初恋竟因为一阵风结束瘦身食谱的做法是什么幼儿园大班班主任年度个人工作总结模板

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利