通过filter过滤器对请求参数进⾏处理-完整
遇见的问题:
  前台把参数通过报⽂或者使⽤表单、ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller⾥⾯的每⼀个⽅法⾥都需要进⾏解密处理。如果⽅法太多,那就太⿇烦了。
设计⽅案:
  使⽤过滤器,在⼀个Filter中将 HttpServletRequest ⾥的所有参数都取出来分别进⾏过滤然后再放回到该HttpServletRequest 中⾏不⾏呢?通过测试后发现是不⾏的,因为HttpServletRequest 只提供了getParameter ,⽽没有提供setParameter;所以,我们只能⾃⼰写⼀个HttpServletRequest ⽅法继承HttpServletRequestWrapper,然后覆盖⾥⾯的⽅法,并且增加我们⾃⼰的setParameters⽅法,这样我们就可以为所欲为了,最后再在filter中调⽤该类的⽅法对参数进⾏处理(获取、修改、存储等等)。
还有⼀种⽐较简单的⽅式:
解决⽅案:
  在请求参数到达controller之前,在filter⾥⾯进⾏解密;这样,通过简单的过滤器处理,把需要处理的请求都在过滤器⾥进⾏解密操作,这样就等于实现了⾃动化处理。
这⾥我们针对两种不同的请求⽅式进⾏讲解:1.普通的表单、ajax请求;2.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<String , String[]> params = new HashMap<String, String[]>();
// 构造⽅法
public MyHttpServletRequestWrapper1(HttpServletRequest request) throws IOException {
super(request);
// 把请求参数添加到我们⾃⼰的map当中
this.params.ParameterMap());
}
/**
* 添加参数到map中
* @param extraParams
*/
public void setParameterMap(Map<String, Object> extraParams) {
for (Map.Entry<String, Object> entry : Set()) {
Key(), Value());
}
}
/
**
* 添加参数到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 = (name);
if(values == null || values.length == 0) {
return null;
}
return values[0];
}
/**
* 重写getParameterValues⽅法,从当前类的 map中取值
* @param name
* @return
*/
@Override
public String[] getParameterValues(String name) {
(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.quest.MyHttpServletRequestWrapper1;
/
**
* 参数处理验过滤器(针对ajax、表单等请求) 1.获取请求参数; 2.对获取到的请求参数进⾏处理(解密、字符串替、请求参数分类截取等等); 3.把处理后的参数放回到请求列表⾥⾯
*
* @author zhaoheng
*
*/
public class ValidatorFilter1 implements Filter {
private static final Logger log = Logger(ValidatorFilter1.class);
/**
* 需要过滤的地址
*/
private static List<String> 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 = Parameter("email");
// 2.把处理后的参数放回去(这⾥是⼤⼩转⼩写处理)
requestWrapper1.setParameter("email", LowerCase());
// 3.放⾏,把我们的requestWrapper1放到⽅法当中
chain.doFilter(requestWrapper1, response);
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
第三步:过滤器的配置
⽅法⼀、在l⽂件⾥⾯进⾏简单的配置(⼀般项⽬)
把我们的过滤器在该⽂件中注册
<!--  配置过滤器  -->
<filter>
<filter-name>ValidatorFilter1</filter-name>
<!--  我们写的过滤的地址  -->
<filter-class>com.zhh.filter.ValidatorFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>ValidatorFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
⽅法⼆、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);
}
请求⽰例代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>请求demo</title>
</head>
<body>
<form id="userForm" action="#" method="post">
username:<input type="text" id ="userName" name="userName" value="21088888"/><br/><br>
email:<input type="text" id ="email" name="email" value="zhaoHENG@163"/><br/><br/>
age:<input type="text" id ="age" name="age" value="18"/><br/><br/>
<input type="reset" value="重置"/>  
<input type="button" id ="sub" value="提交">
</form>
</body>
<script src="jquery.min.js"></script>
<script type="text/javascript">
$("#sub").click(
function(){
var userName = $("#userName").val();
var email = $("#email").val();
var age = $("#age").val();
$.ajax({
param name
type : "POST",
url:'127.0.0.1:8080/merchant_wap/pastOrder/filterCsF2',
dataType : "json",
data : {
"userName":userName,
"age":age,
"email":email
},
success : function(data) {
alert("33");
},
error : function(data) {
alert("cccc"+ail);
}
});
}
);
</script>
</html>
处理结果:
处理后的参数:21088888  zhaoheng@163
从结果可以看出,我们成功的通过过滤器对请求的email进⾏⼤写转⼩写处理
2.json格式的报⽂请求;
第⼀步:新建⼀个类
这个类继承⾃HttpServletRequestWrapper

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。