我正在使用带有Spring引导的Jersey,需要将Jersey配置为作为servlet过滤器运行。问题在于,对于multipart,对于所有请求,我们都会收到400个错误的请求。进一步的研究表明
HiddenHttpMethodFilter
问题是,当它读取请求参数时,导致读取请求流,泽西岛没有留下任何内容。
为了解决这个问题,我正在做的是
Hiddenhttp方法过滤器
:将泽西过滤器配置为在此过滤器之前运行。
注意:在发生多部分POST请求的情况下,此过滤器需要在多部分处理之后运行,因为它固有地需要检查POST主体参数。
为了配置泽西过滤器的顺序,我使用的是SpringBoot属性
spring.jersey.filter.order=-100000
这是可行的。下面是过滤链订单的前后日志
以前
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
Mapping filter: 'httpPutFormContentFilter' to: [/*]
Mapping filter: 'requestContextFilter' to: [/*]
Mapping filter: 'jerseyFilter' to urls: [/*]
后
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'jerseyFilter' to urls: [/*]
Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
Mapping filter: 'httpPutFormContentFilter' to: [/*]
Mapping filter: 'requestContextFilter' to: [/*]
所以你可以看到
jerseyFilter
重新排序正确。但是
requestContextFilter
需要在
运动衫过滤器
. 我在找消息来源
JerseyAutoConfiguration
它表明
请求上下文筛选器
订单设置为
-1
泽西过滤器配置。但这似乎不是发生的事情
@Bean
@ConditionalOnMissingBean
public FilterRegistrationBean<RequestContextFilter> requestContextFilter() {
FilterRegistrationBean<RequestContextFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new RequestContextFilter());
registration.setOrder(this.jersey.getFilter().getOrder() - 1);
registration.setName("requestContextFilter");
return registration;
}
在进一步的调查中,我发现上面列出的所有过滤器
Ordered
子类,我假设它是正在注册的。例如,有一个
OrderedRequestContextFilter
,订单设置为
-105
. 如果我把
DEBUG
日志记录,我可以看到情况仍然如此,即使我设置了jersey filter order属性
'characterEncodingFilter'; order=-2147483648,
'hiddenHttpMethodFilter'; order=-10000,
'httpPutFormContentFilter'; order=-9900,
'requestContextFilter'; order=-105,
所以基本上,我只是想找出正确的方法来改变
RequestContextFilter
这样它就可以在泽西过滤器之前执行。