通过 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 {
     
    }
}

记得点「」和「在看」↓

爱你们

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpServletRequestheader属性可以通过getRequestHeader()方法来获取。你可以使用该方法传入header的名称作为参数,然后获取到对应的header值。此外,你也可以使用getHeaders()方法来获取所有的header属性,返回一个Enumeration类型的对象,通过遍历该对象可以获取到所有的header属性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring Boot 拦截器+kibana 配置.zip](https://download.csdn.net/download/hanghangaidoudou/11665252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [重写HttpServletRequestHeader](https://blog.csdn.net/q410654146/article/details/114937739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [通过 Filter包装 HttpServletRequest 添加定义 header](https://blog.csdn.net/huangjinjin520/article/details/126025978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值