代码之家  ›  专栏  ›  技术社区  ›  Paul Samsotha

筛选器链中RequestContextFilter的更改顺序

  •  0
  • Paul Samsotha  · 技术社区  · 7 年前

    我正在使用带有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 这样它就可以在泽西过滤器之前执行。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Paul Samsotha    7 年前

    所以在 WebMvcAutoConfiguration ,我发现

    @Bean
    @ConditionalOnMissingBean({ RequestContextListener.class,
            RequestContextFilter.class })
    public static RequestContextFilter requestContextFilter() {
        return new OrderedRequestContextFilter();
    }
    

    所以我尝试添加相同的bean并在 OrderedRequestContextFilter .

    @Bean
    public RequestContextFilter requestContextFilter() {
        OrderedRequestContextFilter filter = new OrderedRequestContextFilter();
        filter.setOrder(-100001);
        return filter;
    }
    

    这奏效了,我得到了我想要的结果; RequestContextFilter 在泽西过滤器前订购。

    Mapping filter: 'characterEncodingFilter' to: [/*]
    Mapping filter: 'requestContextFilter' to: [/*]
    Mapping filter: 'jerseyFilter' to urls: [/*]
    Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    Mapping filter: 'httpPutFormContentFilter' to: [/*]