文章目录
在项目中不同服务之间调用经常会使用加密,这时我们需要在控制层先解密再执行对应的业务逻辑,所以我在想可不可以使用Filter先解密,控制器直接拿到的是解密后的请求参数呢
此时需要使用HttpServletRequestWrapper类,因为HttpServletRequest中的getParameterMap获取到的map上了锁,直接更改会报错
java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap
所以我们使用装饰者模式使用HttpServletRequestWrapper来更换请求,达到更换请求参数的目的。首先创建一个类继承HttpServletRequestWrapper:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map params;
public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
super(request);
this.params = newParams;
}
public Map getParameterMap() {
return params;
}
public Enumeration getParameterNames() {
Vector l = new Vector(params.keySet());
return l.elements();
}
public String[] getParameterValues(String name) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
return (String[]) v;
} else if (v instanceof String) {
return new String[] { (String) v };
} else {
return new String[] { v.toString() };
}
}
public String getParameter(String name) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
return strArr[0];
} else {
return null;
}
} else if (v instanceof String) {
return (String) v;
} else {
return v.toString();
}
}
}
然后在自己使用的过滤器中使用该对象更换原请求对象
///解密后的操作
HashMap m = new HashMap(request.getParameterMap());
m.put(***)//你想更换的参数
ParameterRequestWrapper parameterRequestWrapper = new ParameterRequestWrapper((HttpServletRequest)request,m);
request = parameterRequestWrapper;
super.doFilter(request, response, chain);