通过 Filter 与包装 HttpServletRequest 添加自定义 header

JAVA乐园

共 3442字,需浏览 7分钟

 ·

2022-08-01 09:35


      有时通过过滤器 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);    }     @Override    public String getHeader(String name) {        String headerValue = super.getHeader(name);        if (headerMap.containsKey(name)) {            headerValue = headerMap.get(name);        }        return headerValue;    }     @Override    public Enumeration<String> getHeaderNames() {        List<String> names = Collections.list(super.getHeaderNames());        for (String name : headerMap.keySet()) {            names.add(name);        }        return Collections.enumeration(names);    }     @Override    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 {     @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 {         }}


记得点「」和「在看」↓

爱你们

浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报