遇见的问题: 前台把参数通过报文或者使用表单、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