通过 Filter 与包装 HttpServletRequest 添加自定义 header
有时通过过滤器 Filter 与包装 HttpServletRequest 添加自定义 header;非常有用。有类似如下一些场景:
通过网关转发到应用服务,都会透传一个 long 类型的用户 id;有个灰度方案,通过这个用户 id 取余进行灰度逻辑;想在每个请求都添加一个灰度的请求头 grey-flag。这时就需要向 HttpServletRequest 添加请求。默认 HttpServletRequest 是没有提供类型 addHeader(name, value) 或者 setHeader(name, value) 的方法的。
项目有时候为了简化业务逻辑,想在 Filter 中统一添加一些 Header 信息。比如使用 token 获取到 userId 后,添加到 Header 中,这样各个业务就可以直接使用 userId。
定义 HttpServletRequest 包装类
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.util.*;/*** Filter请求拦截中添加header属性**/public class CustomRequestWrapper extends HttpServletRequestWrapper {private Map<String, String> headerMap = new HashMap<String, String>();public CustomRequestWrapper(HttpServletRequest request) {super(request);}public void addHeader(String name, String value) {headerMap.put(name, value);}public String getHeader(String name) {String headerValue = super.getHeader(name);if (headerMap.containsKey(name)) {headerValue = headerMap.get(name);}return headerValue;}public Enumeration<String> getHeaderNames() {List<String> names = Collections.list(super.getHeaderNames());for (String name : headerMap.keySet()) {names.add(name);}return Collections.enumeration(names);}public Enumeration<String> getHeaders(String name) {List<String> values = Collections.list(super.getHeaders(name));if (headerMap.containsKey(name)) {values.add(headerMap.get(name));}return Collections.enumeration(values);}}
自定义Filter
public class CustomHeaderFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;CustomRequestWrapper requestWrapper = new CustomRequestWrapper(req);//获得请求参数中的token值String token = request.getParamter("token");if(!StringUtils.isEntry(token)){// TODO 处理token调用addHeader方法}chain.doFilter(request, response);// Goes to default servlet.}public void init(FilterConfig filterConfig) throws ServletException {}}
记得点「赞」和「在看」↓
爱你们
评论
