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

简介: 通过 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);
    }
    @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 {
    }
}
相关文章
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
8月前
add过滤器
【2月更文挑战第25天】add过滤器。
30 1
|
Java Spring
springMVC中获取request 对象
springMVC中获取request 对象
|
存储 API
10JavaWeb基础 - Request类
10JavaWeb基础 - Request类
76 0
|
XML 网络安全 Android开发
Volley学习笔记 | 关于源码中Request、Response、Listener泛型的理解(附XMLRequest自定义代码)
Volley学习笔记 | 关于源码中Request、Response、Listener泛型的理解(附XMLRequest自定义代码)
在SpringMVC中获取request对象的几种方式
在SpringMVC中获取request对象的几种方式   1.最简单的方式(注解法) 1 2 @Autowired private  HttpServletRequest request; 2.
1437 0