場景:過濾器中獲取參數(shù)Token并添加到請求頭(用戶認(rèn)證兼容老系統(tǒng))
請求頭和請求參數(shù)是不能直接修改卷仑,也沒有提供修改的方法芦疏,但是可以在過濾器和攔截器中使用HttpServletRequestWrapper
包裝類達(dá)到修改的目的外永。
一躯泰、實現(xiàn)HttpServletRequestWrapper
接口进肯,下面直接使用匿名類
package com.xxxx.web.filter;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.Enumeration;
@WebFilter
public class AuthHeaderSettingFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) request) {
/**
* 當(dāng)調(diào)用request.getHeader("token")時牡彻,則獲取請求參數(shù)中token值并當(dāng)做Header的值返回
* @param name
* @return
*/
@Override
public String getHeader(String name) {
// 先從原本的Request中獲取頭估灿,如果為空且名字為token崇呵,則從參數(shù)中查找并返回
String superHeader = super.getHeader(name);
if("token".equals(name) && StringUtils.isEmpty(superHeader)){
String token = request.getParameter("token");
if (StringUtils.isNotEmpty(token)) {
return token ;
}
}
return superHeader;
}
};
chain.doFilter(requestWrapper,response);
}
@Override
public void destroy() {
}
}
二、HttpServletRequestWrapper
馅袁、ServletRequestWrapper
和HttpServletRequest
接口中的很多方法都可以重寫
- 要想增加一個請求參數(shù)可以在
HttpServletRequestWrapper
中重寫getParameter(String name)
@Override
public String getParameter(String name) {
if("newParam".equals(name)){
return "這是我新增加的參數(shù)";
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap() {
HashMap<String, String[]> newMap = new HashMap<>();
newMap.putAll(super.getParameterMap());
newMap.put("newParam",new String[]{"這是我新增加的參數(shù)"}) ;
return Collections.unmodifiableMap(newMap);
}
@Override
public String[] getParameterValues(String name) {
if("newParam".equals(name)){
return new String[]{"這是我新增加的參數(shù)"};
}
return super.getParameterValues(name);
}
注意:
getParameterMap()
返回的時一個不可修改的map ,不能直接向里面put值演熟, 所以在重寫這個方法時要自己new 一個HashMap ,然后在新建的map中放值,最后返回時必須調(diào)用Collections.unmodifiableMap(Map<? extends K, ? extends V> m)
把map改成不可變的
-
結(jié)構(gòu)
image.png
image.png
參考:
- Safely add / modify Servlet request parameter values -- 可能要代理才能訪問