如何调整RequestContextFilter顺序使其在Jersey Filter前执行?
我之前也碰到过完全一样的场景,折腾了好一阵才理清整个问题的来龙去脉——调整Jersey Filter顺序避开HiddenHttpMethodFilter后,OrderedRequestContextFilter又跑到Jersey后面了,导致Request上下文无法正确初始化。下面给你两种靠谱的解决方法:
方法一:通过配置文件直接指定顺序
Spring Boot允许我们通过配置项直接设置OrderedRequestContextFilter的执行顺序,只需要在application.properties或者application.yml里添加如下配置:
application.properties
# 你已经设置的Jersey Filter顺序 spring.jersey.filter.order=-100000 # RequestContextFilter的顺序要比Jersey小1,确保先执行 spring.filter.order.request-context=-100001
application.yml
spring: jersey: filter: order: -100000 filter: order: request-context: -100001
这个配置会直接覆盖OrderedRequestContextFilter的默认order值(-105),让它优先于Jersey Filter执行,保证Request上下文在Jersey处理请求前就已经初始化完成。
方法二:通过Java配置类手动注册并指定顺序
如果配置文件的方式不符合你的需求,也可以通过自定义配置类来显式注册OrderedRequestContextFilter,并设置它的顺序:
import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterOrderConfig { @Bean public OrderedRequestContextFilter requestContextFilter() { OrderedRequestContextFilter filter = new OrderedRequestContextFilter(); // 设置比Jersey Filter更小的order值,这里用你设置的Jersey order减1 filter.setOrder(-100001); return filter; } }
这样做的好处是可以更灵活地控制Filter的注册逻辑,比如根据环境变量动态调整顺序。
问题根源说明
本质原因是:OrderedRequestContextFilter的默认order是固定的-105,而Spring Boot的JerseyAutoConfiguration中原本的逻辑是把RequestContextFilter的order设为Jersey Filter的order减1,但这个逻辑只针对原生的RequestContextFilter,而实际项目中注册的是OrderedRequestContextFilter(Spring Boot自动配置的),它的默认order不会自动跟随Jersey Filter的配置变化,所以必须手动调整。
内容的提问来源于stack exchange,提问作者Paul Samsotha

