本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除;
但在后台程序中,一般对request的参数的操作,都是通过request的getParameter、getParameterNames、getParameterValues等方法执行的;所以我们要是能重写这些方法,就从侧面改变了request的请求参数。恰好,servlet就提供了一个HttpServletRequestWrapper类来供大家去继承(该类是HttpServletRequest的封装类,public class HttpServletRequestWrapper extends ServletRequestWrapper implements
HttpServletRequest{}),重写request相关方法。
修改request参数的整体流程就是:会定义一个拦截器,在请求刚进入项目的时候,拦截住request,处理之后再将其放回。
案例如下:
//@WebFilter(filterName = "paramFilter", urlPatterns = "/*")//拦截器拦截所有请求
//@Order(100)//括号中的数字越大,在多个拦截器的执行顺序越靠前
public class ParamFilter extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest wrapper = new RequestWrapper(request);//定义一个新的request(名称是wrapper),
filterChain.doFilter(wrapper, response);//将修改过的request(wrapper)放回
}
private static class RequestWrapper extends HttpServletRequestWrapper {//这里用的是内部类,也可以不用
private Map params = new HashMap();//将request对象中的参数修改后,放在这个集合里,随后项目取的所有Parameter都是从这个集合中取数
public RequestWrapper(HttpServletRequest request) {//定义构造函数
super(request);//将request交给父类
//先通过request原生的方法,遍历获取到的参数
Enumeration enu=request.getParameterNames();
while (enu.hasMoreElements()) {
String paraName=(String)enu.nextElement();
Map paraObj = (Map)JSONUtils.parse(paraName);//因为我前台传过来的是json格式的参数
Set> entrySet = paraObj.entrySet();
for (Entry entry : entrySet) {
String key = entry.getKey();
Object value = entry.getValue();
params.put(key, value);//
}
}
//在这里修改params中的数据,不管是添加、修改
......
//将修改好的params重新放入RequestWrapper对象中
addParameters(request,params);
}
public void addAllParameters(MapotherParams) {//增加多个参数
for(Map.Entryentry : otherParams.entrySet()) {
addParameter(entry.getKey() , entry.getValue());
}
}
@Override
public String getParameter(String name) {
String[]values = params.get(name);
if(values == null || values.length == 0) {
return null;
}
return StringEscapeUtils.escapeHtml4(values[0]);
}
@Override
public Enumeration getParameterNames() {
Vector v = new Vector();
Set> entrySet = params.entrySet();
for (Entry entry : entrySet) {
v.add(entry.getKey());
}
Enumeration en = v.elements();
return v.elements();
}
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
}
}