如何使用wrapper在filter修改request参数

阅读更多

在filter里如何修改提交的参数呢? 

整个request接口是没有提供这样的API的,即使取出ParameterMap,也是只读的。 

必须创建一个wrapper:class ParameterRequestWrapper,继承:HttpServletRequestWrapper,里面至少要实现这些方法: 

Java代码   收藏代码
  1. private Map params;  
  2. public ParameterRequestWrapper(HttpServletRequest request,Map newParams) {  
  3.   super(request);  
  4.   this.params=newParams;  
  5. }  
  6. public Map getParameterMap() {  
  7.   return params;  
  8. }  
  9. public Enumeration getParameterNames() {  
  10.   Vector l=new Vector(params.keySet());  
  11.   return l.elements();  
  12. }  
  13. public String[] getParameterValues(String name) {  
  14.   Object v = params.get(name);  
  15.   if(v==null){  
  16.     return null;  
  17.   }else if(v instanceof String[]){  
  18.     return (String[]) v;  
  19.   }else if(v instanceof String){  
  20.     return new String[]{(String) v};  
  21.   }else{  
  22.     return new String[]{v.toString()};  
  23.   }  
  24. }  
  25. public String getParameter(String name) {  
  26.   Object v = params.get(name);  
  27.   if(v==null){  
  28.     return null;  
  29.   }else if(v instanceof String[]){            
  30.     String []strArr=(String[]) v;  
  31.     if(strArr.length>0){  
  32.       return strArr[0];  
  33.     }else{  
  34.       return null;  
  35.     }  
  36.   }else if(v instanceof String){  
  37.     return (String) v;  
  38.   }else{  
  39.     return v.toString();  
  40.   }  
  41. }      


map, names, values, 一个都不能少啊。 


在filter里,这样写: 

Java代码   收藏代码
  1. HttpServletRequest request=(HttpServletRequest) req;  
  2. HashMap m=new HashMap(request.getParameterMap());  
  3. String fullURL = request.getRequestURI()+"?"+request.getQueryString();  
  4. if(matchURL(fullURL) && processParamsters(m)){  
  5.   ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(request,m);         
  6.   chain.doFilter(wrapRequest, resp);  
  7. }else{  
  8.   chain.doFilter(req, resp);  
  9. }  


matchURL是匹配url来决定是否生效,processParamsters是自定义函数,想怎么处理就怎么处理。 

这样的话,经过filter之后,实际上request变成了ParameterRequestWrapper,以后的filter将会操作这个类。不过似乎用在ActionForward上有点问题,还没解决。 

这也是j2ee推荐的办法,除了改参数外还可以作很多事,完全可以定制request。

你可能感兴趣的:(如何使用wrapper在filter修改request参数)