利用HttpServletRequestWrapper和filter改变request的getParameter方法

本文介绍了如何通过在web.xml配置filter,以及创建ParameterRequestWrapper类来修改HttpServletRequest的getParameter方法,以此改变请求参数。在Filter中,将原始请求包装成ParameterRequestWrapper并添加新的参数,然后传递给FilterChain。在测试中,可以验证修改后的参数值是否生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在web.xml中添加   
    <filter-mapping>
        <filter-name>sysfunctionFilter</filter-name>
        <url-pattern>/functionCode/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>changeParameterFilter</filter-name>
        <filter-class>com.brainlong.ccbs.global.filter.ChangeParameterFilter</filter-class>
    </filter>


2.建立ChangeParameterFilter.java和ParameterRequestWrapper类
package com.brainlong.ccbs.global.filter;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class  ChangeParameterFilter implements Filter {
    private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter initialized");
        this.filterConfig = filterConfig;
    }

    public void destroy() {
        System.out.println("Filter destroyed");
        this.filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest)request);
        requestWrapper.addParameter("fff" , "我靠");
        chain.doFilter(requestWrapper, response);
    }
    public class ParameterRequestWrapper extends HttpServletRequestWrapper {

            private Map<String , String[]> params = new HashMap<String, String[]>();


           @SuppressWarnings("unchecked")
            public ParameterRequestWrapper(HttpServletRequest request) {
              // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
                super(request);
               //将参数表,赋予给当前的Map以便于持有request中的参数
                this.params.putAll(request.getParameterMap());
              }
        //重载一个构造方法
          public ParameterRequestWrapper(HttpServletRequest request , Map<String , Object> extendParams) {
            this(request);
              addAllParameters(extendParams);//这里将扩展参数写入参数表
             }
            @Override
         public String getParameter(String name) {//重写getParameter,代表参数从当前类中的map获取
            String[]values = params.get(name);
               if(values == null || values.length == 0) {
                       return null;
               }
                 return values[0];
         }
         public String[] getParameterValues(String name) {//同上
                return params.get(name);
             }
           public void addAllParameters(Map<String , Object>otherParams) {//增加多个参数
               for(Map.Entry<String , Object>entry : otherParams.entrySet()) {
                        addParameter(entry.getKey() , entry.getValue());
                     }
             }
           public void addParameter(String name , Object value) {//增加参数
             if(value != null) {
                    if(value instanceof String[]) {
                               params.put(name , (String[])value);
                      }else if(value instanceof String) {
                              params.put(name , new String[] {(String)value});
                     }else {
                           params.put(name , new String[] {String.valueOf(value)});
                         }
                  }
             }
       }

}


3.测试
在任意一个action中调用
String a = request.getParameter("fff");
看a值是否为"我靠"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值