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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM