前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring使用Filter添加自定义header

Spring使用Filter添加自定义header

作者头像
十毛
发布2019-07-18 16:43:51
4.6K1
发布2019-07-18 16:43:51
举报

项目中有时候为了简化业务逻辑,可以在Filter中统一添加一些header信息,比如使用token获取到userId后,添加到header中,这样各个业务就可以直接使用useId。

定义Request包装类

  • MutableHttpServletRequest
代码语言:javascript
复制
final class MutableHttpServletRequest extends HttpServletRequestWrapper {
    private final Map<String, String> customHeaders;
 
    public MutableHttpServletRequest(HttpServletRequest request){
        super(request);
        this.customHeaders = new HashMap<>();
    }
    
    public void putHeader(String name, String value){
        this.customHeaders.put(name, value);
    }

    @Override
    public String getHeader(String name) {
        String headerValue = customHeaders.get(name);
        
        if (headerValue != null){
            return headerValue;
        }
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }

    @Override
    public Enumeration<String> getHeaderNames() {
        if (customHeaders.isEmpty()) {
            return super.getHeaderNames();
        }

        Set<String> set = new HashSet<String>(customHeaders.keySet());
        // 添加自定义header
        Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (e.hasMoreElements()) {
            String n = e.nextElement();
            set.add(n);
        }
 
        return Collections.enumeration(set);
    }
}

自定义Filter

  • CustomFilter
代码语言:javascript
复制
@Slf4j
@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {

    @Override
    public void destroy() {
        log.info("filter destroy");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        log.info("filter doFilter");
        HttpServletRequest req = (HttpServletRequest) request;
        MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(req);
        mutableRequest.putHeader("x-custom-header", "custom value");
        chain.doFilter(mutableRequest, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("filter init");
    }
}

验证

  • CustomFilterApplication
代码语言:javascript
复制
@ServletComponentScan
@SpringBootApplication
@RestController
public class CustomFilterApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyFilterApplication.class, args);
    }

    @GetMapping("ping")
    public String ping() {
        return "success";
    }
}

注意

  • 当使用@WebFilter时(自动注册),需要再Spring Boot上添加注解@ServletComponentScan

参考

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义Request包装类
  • 自定义Filter
  • 验证
  • 注意
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档