在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。
本文介绍如何在filter中通过创建自定义wrapper类来修改HTTP请求参数,并详细解释了参数映射、URL匹配和自定义处理过程。适用于对请求参数进行定制化的应用场景。

&spm=1001.2101.3001.5002&articleId=82093386&d=1&t=3&u=f2dec5e5c5114e0b9f64f817c214d364)
2560

被折叠的 条评论
为什么被折叠?



