通过 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 {
    }
}
相关文章
|
9月前
|
JSON 前端开发 Java
@RequestParam这个注解的作用
@RequestParam这个注解的作用
459 0
Kam
|
Java Maven
Feign调用把GET请求自动转成POST请求解决:Request method 'POST' not supported
Feign调用把GET请求自动转成POST请求解决:Request method 'POST' not supported
Kam
2249 0
|
9月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
84 0
|
存储 API
10JavaWeb基础 - Request类
10JavaWeb基础 - Request类
79 0
|
前端开发 Java
java在过滤器中为http请求加请求头header
现在有一个需求场景是,每一个请求我都需要在请求头里面加上token这个请求头,作为一种校验机制,传统的接口可以通过设置一个全局的变量,然后通过页面携带过来(大概就是先将我们的token放在session中,写一个服务用来获取session中的token,然后主页面用ajax调用接口,将token放在隐藏域中,然后将请求头放进来,用ajax方法,这里不想洗说了),但是有一种情况是通过页面传递的并不一定都会适用所有接口,比如上传和下载的接口有时候头里面就没有token参数,可能是上传和下载是用表单提交的 这个时候如何将请求头通过后台的方法加进来? 想到用过滤器,用后台方法强制加入请求头。
187 0
|
Java 数据库连接 容器
拦截器Filter的使用
Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的。
157 0
|
XML 网络安全 Android开发
Volley学习笔记 | 关于源码中Request、Response、Listener泛型的理解(附XMLRequest自定义代码)
Volley学习笔记 | 关于源码中Request、Response、Listener泛型的理解(附XMLRequest自定义代码)
|
前端开发 Java Spring