如何获取request中的header的信息,并处理一些逻辑

Xiao Qiang Lv4

实现方式

  • 参考文章 SpringBoot 中使用 Filter 的正确姿势,在这篇文章中解释很多种在spring-boot中实现filter的方式。我们在项目中使用的是可以去掉url区分的影响,所以我们使用@Component注解方式来实现DI,同时还可以使用@Configuration@Bean的方式来实现DI。

  • 实现步骤:

    • 所有自定义的filter都是需要实现javax.servlet.Filter,以下的例子是自定义一个记录日志的filter

      1
      2
      3
      4
      5
      import javax.servlet.Filter;

      public class LoggingFilter implements Filter {
      //xxxxx
      }
    • 将当前的自定义的filter注入到spring-boot容器

      1
      2
      3
      4
      5
      6
      7
      @Configuration
      public class ConfigurationBeans {
      @Bean
      public LoggingFilter loggingFilter() {
      return new LoggingFilter();
      }
      }

遇到的新问题,需要检查request中是否有trace-log-id,如果没有即需要添加一个新的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  public class FilterRequest extends HttpServletRequestWrapper {
private final Map headerMap;

public FilterRequest(HttpServletRequest request) {
super(request);
this.headerMap = new HashMap();
}

public void addHeader(String name, String value){
headerMap.put(name, value);
}

@Override
public String getHeader(String name) {
Object value;

if((value = headerMap.get(""+name)) != null) {
return value.toString();
} else {
return ((HttpServletRequest)getRequest()).getHeader(name);
}
}
}
  • 第二步,我们需要在controller中使用注解@RequestHeader获取header中获取customId,按照文章提到的filter是在request到达Controller前处理,那么即使没有在request中带上头部,loggingFilter也会给当前的request添加一个新的customId。但是实际上没有,如下图所示没有获取到。
    image
    这是为什么呢?
  • 我们把注解@RequestHeader的源码下载下来,filter确实已经替换了原始的request,并且也把新的request传到了controller中
    image
    我们继续看了一下注解的实现,发现了原来@RequestHeader的注解使用的方法,我没有实现,
    image
    所以我做了如下的重构,重写了getHeaders()而不是getHeader(),上述过程中几个类的调用关系,如下图所示:
    image
  • Title: 如何获取request中的header的信息,并处理一些逻辑
  • Author: Xiao Qiang
  • Created at : 2023-04-27 18:42:49
  • Updated at : 2025-03-08 10:49:30
  • Link: http://fdslk.github.io/tech/java/filter/2023/04/27/little-stuffs-in-spring-filter/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
如何获取request中的header的信息,并处理一些逻辑