• preHandle 添加参数和重写参数的问题,重写HttpServletRequestWrapper和Filter


    由于 preHandle 中HttpServletRequest 只有setAttribute而没有setParameter 也没有 add 方法

    所以是没办法直接添加参数的。从网上查了很多资料,基本都是说要重写HttpServletRequestWrapper

    说干就干,通过网上查博客看看别人的实现方式,可能因为自己底子不够扎实吧,很多都看不懂,摸索了

    一天总算是弄出来了。现在记录一下,方便以后查阅。

    首先,创建一个ChangeRequestWrapper 类继承HttpServletRequestWrapper,代码如下

    package com.ccs.ssmis.common.interceptors;
    
    import com.ccs.ssmis.common.redis.RedisUtils;
    import com.ccs.ssmis.common.utils.Constants;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.*;
    
    public class ChangeRequestWrapper extends HttpServletRequestWrapper {
    
        private Map<String, String[]> parameterMap; // 所有参数的Map集合
    
        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[] results = parameterMap.get(name);
            return results[0];
        }
    
    
        /**
         * 获取指定参数名的所有值的数组,如: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。代码如下

    package com.ccs.ssmis.common.interceptors;
    
    import com.ccs.ssmis.common.redis.RedisUtils;
    import com.ccs.ssmis.common.utils.Constants;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    public class LangFilter implements Filter {
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
    
            Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
    
            String[] strings = parameterMap.get("token");
            //逻辑代码 判断有没有传入token,如果没有,则直接通过
            if (strings == null || strings.length == 0) {
                changeRequestWrapper.setParameterMap(parameterMap);
            }else{
                logger.info("=============拦截器解析token==================");
                parameterMap.put("token", strings);
                //解析token
                Map<String, Object> map = RedisUtils.getMap(strings[0] + Constants.token_Suffix);
                parameterMap.put("isok", "false".split(","));
                if (map!=null) {
                    parameterMap.put("userId", map.get("userId").toString().split(","));
                    parameterMap.put("isok", "true".split(","));
                }
                changeRequestWrapper.setParameterMap(parameterMap);
            }
            //复写 HttpServletRequestWrapper
            filterChain.doFilter(changeRequestWrapper, servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    
    
    }

    接着 在web.xml 新增拦截器配置,直接复制进去就可以了。

      <filter>
        <filter-name>languageFilter</filter-name>
        <filter-class>com.ccs.ssmis.common.interceptors.LangFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
    
      <filter-mapping>
        <filter-name>languageFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

    注意:配置的拦截器会在preHandle方法之前执行。所以逻辑代码可以直接写在Filter的重写类里面

    希望大家共同学习共同进步。谢谢。

    本博客是借鉴别人的博客改写的,转载请注明来处谢谢。

    参考地址:https://www.cnblogs.com/cach/p/8052108.html

    链接地址:http://www.cnblogs.com/richard-ju/p/L2018003.html

  • 相关阅读:
    javascript Math.random()随机数函数
    asp.net 前台获取后台c#代码信息
    关于C#网站一般处理程序(ashx)中session的问题
    怎样才能在一般处理文件中创建新的Session和访问已经存在的Session?
    使用SqlParameter向数据库中插入数据
    C#串口编程学习简单实例
    认识nodejs
    01.Javascript中的接口Interface [转载]
    动态添加脚本,并触发回调函数 初步实现按需加载
    JS正则表达式 收藏
  • 原文地址:https://www.cnblogs.com/richard-ju/p/L2018003.html
Copyright © 2020-2023  润新知