由於 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
