如何获取request中的header的信息,并处理一些逻辑
实现方式
参考文章 SpringBoot 中使用 Filter 的正确姿势,在这篇文章中解释很多种在spring-boot中实现filter的方式。我们在项目中使用的是可以去掉
url
区分的影响,所以我们使用@Component
注解方式来实现DI,同时还可以使用@Configuration
和@Bean
的方式来实现DI。实现步骤:
所有自定义的filter都是需要实现
javax.servlet.Filter
,以下的例子是自定义一个记录日志的filter1
2
3
4
5import javax.servlet.Filter;
public class LoggingFilter implements Filter {
//xxxxx
}将当前的自定义的filter注入到spring-boot容器
1
2
3
4
5
6
7
public class ConfigurationBeans {
public LoggingFilter loggingFilter() {
return new LoggingFilter();
}
}
遇到的新问题,需要检查request中是否有trace-log-id,如果没有即需要添加一个新的
- 参考了一篇文章,Java Web 中对 ServletRequest 的一些非常规操作解决方案,确认了
ServletRequest
无法修改,只能是一个只读对象,需要使用HttpServletRequestWrapper
封装才能修改,需要这里我们需要创建一个新的对象来继承HttpServletRequestWrapper
。
1 | public class FilterRequest extends HttpServletRequestWrapper { |
- 第二步,我们需要在controller中使用注解
@RequestHeader
获取header中获取customId
,按照文章提到的filter是在request到达Controller前处理,那么即使没有在request中带上头部,loggingFilter
也会给当前的request添加一个新的customId
。但是实际上没有,如下图所示没有获取到。
这是为什么呢? - 我们把注解
@RequestHeader
的源码下载下来,filter确实已经替换了原始的request,并且也把新的request传到了controller中
我们继续看了一下注解的实现,发现了原来@RequestHeader
的注解使用的方法,我没有实现,
所以我做了如下的重构,重写了getHeaders()
而不是getHeader()
,上述过程中几个类的调用关系,如下图所示:
- 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