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

posted @ 2018-03-19 17:54  六界神话  阅读(4446)  评论(0编辑  收藏  举报