我在初始化程序中有以下代码:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Filter[] getServletFilters() {
DelegatingFilterProxy shiroFilter = new DelegatingFilterProxy("shiroFilter");
shiroFilter.setTargetFilterLifecycle(true);
return new Filter[]{new CorsFilter(),shiroFilter};
}
}
我希望在CorsFilter
之前执行ShiroFilter
。但是,Spring文档并未说明执行过滤器的顺序取决于它们在返回数组中的顺序。
如果是,有人可以澄清一下吗?如果没有,有人可以建议如何做我保证过滤器的执行顺序吗?
答案 0 :(得分:11)
只是为了让问题保持最新。
@Component(value = "myCorsFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
[...]
}
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppConfiguration.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new DelegatingFilterProxy("myEncodingFilter"),
new DelegatingFilterProxy("myCorsFilter"), // or just new CorsFilter()
new DelegatingFilterProxy("mySecurityFilter") //...
};
}
}
答案 1 :(得分:4)
过滤器已在order of the array中注册。
这会导致ServletContext.addFilter()
按项目顺序调用,但是,我不确定这是否实际导致过滤器按照它们的顺序执行注册
Spring确实提供了org.springframework.web.filter.CompositeFilter
,因此我只返回一个包含您实际想要使用的两个过滤器的CompositeFilter
。
答案 2 :(得分:0)
对于可能想要使用javax注释而不是spring order的人,也可以使用@javax.annotation.Priority
注释代替@Order,例如来自&#34; dit&#34;上面。