2016-07-07 116 views
1

我试图在弹簧过滤器链内插入(在第一个位置)一个简单的自定义Cors过滤器。SpringBoot如何设置无注释过滤器的顺序

如果我不喜欢这样

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

它完美 我可以把一个断点在Spring的ServletHandler.java那里行

chain=getFilterChain(baseRequest, target, servlet_holder); 

我只是想知道,如果验证我希望不是使用@Componenent and @Order,而是定义Filter bean的应用程序上下文。 如何设置过滤器的顺序?

+1

使用'@ Component'将其定义为一个bean。但是,如果你必须,为文件管理器创建一个'@ Bean'方法,并添加一个'FilterRegistrationBean'并设置它的'order'属性。 –

+0

是的,这是它的感谢! – Johny19

回答

4

见例如: 在你的类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”

警告:在类过滤器,不要使用@Component注解。

+0

解决了我的问题。感谢分享! –

3

在corsFilter的情况下,通常需要在springSecurityFilterChain和其他过滤器(如spring引导的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; 
    } 
} 

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

+0

您的解决方案适合我。但是,我不明白为什么。我认为这是CorsFilter的缺陷或缺点。 – chenatu

+0

我不认为这是一个错误,我敢肯定,它将工作得很好,而不会设置顺序,这将是唯一一个正在使用的过滤器。但是,如果您使用其他过滤器(例如弹簧安全),则需要按顺序按顺序设置正确的顺序。 – megalucio