SpringBoot如何设置Filter的顺序而不需要注解

llmtgqce  于 2023-04-28  发布在  Spring
关注(0)|答案(3)|浏览(240)

我试图插入(在第一个位置)一个简单的自定义科尔过滤器内的Spring过滤器链。
如果我这样做

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

我可以通过在Spring的www.example中放置断点来验证它 www.example.com 哪里有线

chain=getFilterChain(baseRequest, target, servlet_holder);

我只是想知道我是否希望使用@Componenent and @Order,而是在Application上下文中定义Filter bean。如何设置过滤器的顺序?

i86rm4rw

i86rm4rw1#

参见示例:在ServletInitializer类中:

@Bean
 public FilterRegistrationBean requestLogFilter() {
        final FilterRegistrationBean reg = new FilterRegistrationBean(createRequestLogFilter());
        reg.addUrlPatterns("/*");
        reg.setOrder(1); //defines filter execution order
        return reg;
 }

 @Bean
 public RequestLogFilter createRequestLogFilter(){
        return new RequestLogFilter();
 }

我的过滤器的名称是“requestLogFilter”
警告:不要在Filter类中使用@Component注解。

ycggw6v2

ycggw6v22#

在corsFilter的情况下,通常需要设置此过滤器的顺序,以在springSecurityFilterChain之前加载,并将其他过滤器(如 Boot 中的errorPageFilter)加载在链的最开始处。否则CORS支持将被破坏,并且所需的头将不会被引入。这可以通过以下方式实现:

@Configuration
public class MyConfiguration {

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://domain1.com");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(Integer.MIN_VALUE);
        return bean;
    }
}

setOrder(Integer.MIN_VALUE)将确保它是加载的第一个过滤器。即使有其他过滤器,如errorPage过滤器,其顺序设置为Integer。MIN_VALUE(-2147483648)。

bvuwiixz

bvuwiixz3#

另一种选择是让你的过滤器实现org.springframework.core.Ordered,如果你使用的是spring webflux(它没有FilterRegistrationBean),这是唯一的选择:

public class CorsFilter implements Filter, Ordered {
    //...

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE
    }
}

或者你甚至可以把它作为过滤器中的变量。

相关问题