通过 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 {
    }
}
相关文章
|
7月前
|
JSON 前端开发 Java
@RequestParam这个注解的作用
@RequestParam这个注解的作用
359 0
|
7月前
|
JSON 数据格式
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
501 4
|
7月前
|
XML JSON 前端开发
获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
236 1
|
7月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
74 0
|
存储 API
10JavaWeb基础 - Request类
10JavaWeb基础 - Request类
60 0
|
前端开发 API 开发者
后端controller类中方法参数前的注解@ApiParam @RequestParam @PathVariable 用法
后端controller类中方法参数前的注解@ApiParam @RequestParam @PathVariable 用法
|
XML 网络安全 Android开发
Volley学习笔记 | 关于源码中Request、Response、Listener泛型的理解(附XMLRequest自定义代码)
Volley学习笔记 | 关于源码中Request、Response、Listener泛型的理解(附XMLRequest自定义代码)
|
存储 JSON 前端开发
【小家Java】Servlet规范之---请求(request):Servlet中如何获取POST请求参数?(使用getParameter())
【小家Java】Servlet规范之---请求(request):Servlet中如何获取POST请求参数?(使用getParameter())
【小家Java】Servlet规范之---请求(request):Servlet中如何获取POST请求参数?(使用getParameter())