Java Filter过滤器中添加或修改request参数值

业务场景

  在传递数据的过程中, 需要用到加解密, 但是在每个接口中都来调用加解密的话, 整个程序就会变得非常臃肿, 所以当下考虑的解决方法是在统一返回的JsonResult的类中做统一加密, 在Filter中去做统一解密.

遇到的问题

  Filter的doFilter方法中的request只有setAttribute而没有setParameter也没有add方法, 所以是没办法直接添加或修改参数的。只能重写HttpServletRequestWrapper, 然后用自己重写的HttpServletRequestWrapper来修改参数, 再替换doFilter的request.
  原本request参数类型是ServletRequest接口, HttpServletRequestWrapper是ServletRequest的一个实现类.

代码实现

自定义HttpServletRequestWrapper
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;

public class ChangeRequestWrapper extends HttpServletRequestWrapper {

    private Map parameterMap; // 所有参数的Map集合

    /**
     * ChangeRequestWrapper构造函数
     * @param request
     */
    public ChangeRequestWrapper(HttpServletRequest request) {
        super(request);
        // 给参数集合赋值
        parameterMap = request.getParameterMap();
    }


    /**
     * 获取所有参数名
     *
     * @return 返回所有参数名
     */
    @Override
    public Enumeration getParameterNames() {
        Vector vector = new Vector(parameterMap.keySet());
        return vector.elements();
    }

    /**
     * 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
     *
     * @param name 指定参数名
     * @return 指定参数名的值
     */
    @Override
    public String getParameter(String name) {
        String result = super.getParameter(name);
        return result;
    }


    /**
     * 获取指定参数名的所有值的数组,如:checkbox的所有数据
     * 接收数组变量 ,如checkobx类型
     */
    @Override
    public String[] getParameterValues(String name) {
        return parameterMap.get(name);
    }

    @Override
    public Map getParameterMap() {
        return parameterMap;
    }

    public void setParameterMap(Map parameterMap) {
        this.parameterMap = parameterMap;
    }

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

//@WebFilter(filterName = "LangFilter", urlPatterns = "/*")
public class LangFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        // 初始化自定义HttpServletRequestWrapper
        ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);

        // 获取所有参数集合
        Map parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());

        // 修改集合中的某个参数
        parameterMap.put("word", new String[]{"新秩序"});

        // 将集合存到自定义HttpServletRequestWrapper
        changeRequestWrapper.setParameterMap(parameterMap);

        // 替换原本的request
        filterChain.doFilter(changeRequestWrapper, servletResponse);
    }

    @Override
    public void destroy() {

    }


}

参考链接
https://blog.csdn.net/weixin_34061482/article/details/93545118

你可能感兴趣的:(Java Filter过滤器中添加或修改request参数值)