SpringBoot如何设置无注释过滤器的顺序
问题描述:
我试图在弹簧过滤器链内插入(在第一个位置)一个简单的自定义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的应用程序上下文。 如何设置过滤器的顺序?
答
见例如: 在你的类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
解决了我的问题。感谢分享! –
答
在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)。
使用'@ Component'将其定义为一个bean。但是,如果你必须,为文件管理器创建一个'@ Bean'方法,并添加一个'FilterRegistrationBean'并设置它的'order'属性。 –
是的,这是它的感谢! – Johny19