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

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

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

必须创建一个wrapper:class ParameterRequestWrapper,继承: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();
  }
}    


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


在filter里,这样写:

HttpServletRequest request=(HttpServletRequest) req;
HashMap m=new HashMap(request.getParameterMap());
String fullURL = request.getRequestURI()+"?"+request.getQueryString();
if(matchURL(fullURL) && processParamsters(m)){
  ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(request,m);		
  chain.doFilter(wrapRequest, resp);
}else{
  chain.doFilter(req, resp);
}


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

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

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

你可能感兴趣的:(weblogic)