Java 如何在AbstractAnnotationConfigDispatcherServletInitializer Spring中进行过滤器映射
问题是:我可以成功注册过滤器,但不知道如何使用此特定配置设置映射URL 这是我的班级:Java 如何在AbstractAnnotationConfigDispatcherServletInitializer Spring中进行过滤器映射,java,spring,servlet-filters,spring-java-config,Java,Spring,Servlet Filters,Spring Java Config,问题是:我可以成功注册过滤器,但不知道如何使用此特定配置设置映射URL 这是我的班级: public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{
public class WebInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{AppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected Filter[] getServletFilters() {
return new Filter[]{
new DelegatingFilterProxy("springSecurityFilterChain"),
new DelegatingFilterProxy("customFilter")
};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
公共类WebInitializer扩展
AbstractAnnotationConfigDispatchersServletInitializer{
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{AppConfig.Class};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{WebConfig.Class};
}
@凌驾
受保护的筛选器[]getServletFilters(){
返回新筛选器[]{
新的DelegatingFilterProxy(“springSecurityFilterChain”),
新的DelegatingFilterProxy(“customFilter”)
};
}
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{”/“};
}
}
医生。
我已经使用了
WebApplicationInitializer
,但是我想使用AbstractAnnotationConfigDispatcherServletInitializer
对于springSecurityFilterChain,只需将该类添加到与其他配置类相同的包中即可
@Order(2)
public class MyAppSecureWebAppInitializer extends
AbstractSecurityWebApplicationInitializer {
@Override
protected boolean enableHttpSessionEventPublisher() {
return true;
}
}
AbstractSecurityWebApplicationInitializer(来自javadocs)
注册DelegatingFilterProxy以使用
springSecurityFilterChain优先于任何其他已注册的筛选器。什么时候
与AbstractSecurityWebApplicationInitializer(类)一起使用,它将
还要注册一个ContextLoaderListener。与…一起使用时
AbstractSecurityWebApplicationInitializer(),此类通常为
除了AbstractContextLoaderInitializer的子类之外使用
默认情况下,DelegatingFilterProxy在不支持的情况下注册,
但可以通过重写isAsyncSecuritySupported()和
getSecurityDispatcherTypes()
测试前后的附加配置
springSecurityFilterChain可以通过重写
afterSpringSecurityFilterChain(ServletContext)
从spring安全性的例子来看
我能做到这一点的唯一方法是使用FilterRegistration.Dynamic接口。在WebInitializer类中,在onStartup方法中手动添加自定义筛选器(来自超类的重写)。据我所知,目前没有比这更优雅的了
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("my-filter", new MyFilter());
encodingFilter.setInitParameter("blah", "blah");
encodingFilter.addMappingForUrlPatterns(null, false, "/toBeFiltered/*");
super.onStartup(servletContext);
}
如果希望此筛选器正常工作,则最好注释掉已重写的getServletFilters方法,以便从servletContext正确返回此筛选器。A
DelegatingFolderProxy
的目的是委托给实现筛选器接口的SpringBean,因此,过滤器映射必须位于作为参数传递给DelegatingFilterProxy的bean名称的定义中?我不太清楚。谢谢你的澄清,但我的问题是,我在哪里可以告诉过滤器何时将被映射?将被过滤的Url,因为默认情况下,它是从“/”映射的,正如getServletMappings()方法所说。是的,我也是。我希望有一种方法可以做到这一点,而不会过度使用onStartup方法。我同意,但这不是一个很糟糕的解决方案。。至少它可以做到不诉诸完全黑客!如果你对它不满意,你可以在Spring的jira-@dectarin上解决它,非常感谢。几天来,我一直在努力让我的characterEncodingFilter正常工作。提议的简单使用“getServletFilters”方法的解决方案在任何情况下都不起作用。
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("my-filter", new MyFilter());
encodingFilter.setInitParameter("blah", "blah");
encodingFilter.addMappingForUrlPatterns(null, false, "/toBeFiltered/*");
super.onStartup(servletContext);
}