通过 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 headerMap = new HashMap();     public CustomRequestWrapper(HttpServletRequest request) {        super(request);    }     public void addHeader(String name, String value) {        headerMap.put(name, value);    }     @Override    public String getHeader(String name) {        String headerValue = super.getHeader(name);        if (headerMap.containsKey(name)) {            headerValue = headerMap.get(name);        }        return headerValue;    }     @Override    public Enumeration getHeaderNames() {        List names = Collections.list(super.getHeaderNames());        for (String name : headerMap.keySet()) {            names.add(name);        }        return Collections.enumeration(names);    }     @Override    public Enumeration getHeaders(String name) {        List 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 {     @Override        public void destroy() {        }        @Override    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.    }        @Override    public void init(FilterConfig filterConfig) throws ServletException {         }}
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章