request对象添加额外的参数

一、重写 HttpServletRequestWrapper
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
 * <p>向filter过滤器中的request对象添加额外的参数</p><br>
 * TODO(重写 HttpServletRequestWrapper)
 *
 * @author han.sun
 * @version 1.0.0
 * @since 2019/9/16 09:22
 */
public class RequestParameterWrapper extends HttpServletRequestWrapper {


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

    /**
     * override构造器
     *
     * @param request     HttpServletRequest
     * @param extraParams 自定义参数Map
     */
    RequestParameterWrapper(HttpServletRequest request, Map<String, Object> extraParams) {
        this(request);
        addParameters(extraParams);
    }

    /**
     * 重载构造函数
     *
     * @param request HttpServletRequest
     */
    private RequestParameterWrapper(HttpServletRequest request) {
        super(request);
        //将现有parameter传递给params
        this.params.putAll(request.getParameterMap());
    }

    /**
     * 获取所有参数名
     *
     * @return all parameter names
     */
    @Override
    public Enumeration<String> getParameterNames() {
        Vector<String> vector = new Vector<>(params.keySet());
        return vector.elements();
    }


    @Override
    public Map<String, String[]> getParameterMap() {
        return params;
    }


    /**
     * 添加参数
     *
     * @param extraParams 自定义参数Map
     */
    private void addParameters(Map<String, Object> extraParams) {
        for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
            addParameter(entry.getKey(), entry.getValue());
        }
    }


    /**
     * 添加参数
     *
     * @param name  key
     * @param value value
     */
    private 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)});
            }
        }
    }

    /**
     * 重写getParameter,参数从当前类中的map获取
     *
     * @param name key
     * @return value
     */
    @Override
    public String getParameter(String name) {
        String[] values = params.get(name);
        if (values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }

    /**
     * 重写getParameter,参数从当前类中的map获取
     *
     * @param name key
     * @return value
     */
    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }


}

2、编写web请求参数过滤器

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>filter---参数过滤器</p><br>
 * <p>请求已经有该参数,(过滤器覆盖value是无效的)</p><br>
 * TODO(设置自定义request参数)
 *
 * @author han.sun
 * @version 1.0.0
 * @since 2019/5/5 13:12
 */
public class RequestParameterFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String msgId = request.getParameter("msgId");
        if (msgId == null) {
            Map<String, Object> map = new HashMap<String, Object>(16);
            map.put("msgId", new String[]{System.currentTimeMillis() + ""});
            RequestParameterWrapper requestParameterWrapper = new RequestParameterWrapper(request, map);
            chain.doFilter(requestParameterWrapper, servletResponse);
        }else {
            chain.doFilter(servletRequest, servletResponse);
        }
    }

    @Override
    public void destroy() {
    }
}

3、在web.xml中配置过滤规则

    <!-- 自定义过滤器 -->
    <filter>
        <filter-name>requestParameterFilter</filter-name>
        <filter-class>com.eastrobot.log.web.filter.RequestParameterFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>requestParameterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
原文地址:https://www.cnblogs.com/han-sun/p/10845689.html