美文网首页
Java Filter过滤器中添加或修改request参数值

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

作者: KouKuma | 来源:发表于2020-12-07 09:45 被阅读0次

    业务场景

      在传递数据的过程中, 需要用到加解密, 但是在每个接口中都来调用加解密的话, 整个程序就会变得非常臃肿, 所以当下考虑的解决方法是在统一返回的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<String, String[]> parameterMap; // 所有参数的Map集合
    
        /**
         * ChangeRequestWrapper构造函数
         * @param request
         */
        public ChangeRequestWrapper(HttpServletRequest request) {
            super(request);
            // 给参数集合赋值
            parameterMap = request.getParameterMap();
        }
    
    
        /**
         * 获取所有参数名
         *
         * @return 返回所有参数名
         */
        @Override
        public Enumeration<String> getParameterNames() {
            Vector<String> vector = new Vector<String>(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<String, String[]> getParameterMap() {
            return parameterMap;
        }
    
        public void setParameterMap(Map<String, String[]> 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<String, String[]> 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参数值

          本文链接:https://www.haomeiwen.com/subject/zfnmwktx.html