怎么使用wrapper在filter修改request参数(转)
如何使用wrapper在filter修改request参数(转)在filter里如何修改提交的参数呢??整个request接口是没有提供
如何使用wrapper在filter修改request参数(转)
在filter里如何修改提交的参数呢??
整个request接口是没有提供这样的API的,即使取出ParameterMap,也是只读的。?
必须创建一个wrapper:class ParameterRequestWrapper,继承:HttpServletRequestWrapper,里面至少要实现这些方法:?
Java代码??
- 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里,这样写:?
Java代码??

- 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。