问题在于:我可以成功注册过滤器,但不知道如何使用此特定配置设置映射URL。
这是我的班级:
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[]{"/"};
}
}
Pd积。
我是使用WebApplicationInitializer
完成的,但我想使用AbstractAnnotationConfigDispatcherServletInitializer
。
答案 0 :(得分:9)
我能够做到这一点的唯一方法是使用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正确地回送此过滤器。
答案 1 :(得分:-1)
对于springSecurityFilterChain,只需将此类添加到与其他配置类相同的包中
@Order(2)
public class MyAppSecureWebAppInitializer extends
AbstractSecurityWebApplicationInitializer {
@Override
protected boolean enableHttpSessionEventPublisher() {
return true;
}
}
AbstractSecurityWebApplicationInitializer(来自javadocs)
注册DelegatingFilterProxy以使用 springSecurityFilterChain在任何其他注册过滤器之前。什么时候 与AbstractSecurityWebApplicationInitializer(Class)一起使用时,它会 还注册了ContextLoaderListener。使用时 AbstractSecurityWebApplicationInitializer(),这个类通常是 除了AbstractContextLoaderInitializer的子类之外还使用。
默认情况下,DelegatingFilterProxy在没有支持的情况下注册, 但可以通过重写isAsyncSecuritySupported()和来启用 getSecurityDispatcherTypes()。
之前和之后的其他配置 可以通过覆盖添加springSecurityFilterChain afterSpringSecurityFilterChain(ServletContext中)。
从春季安全示例in Github
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceEncoding(true);
DelegatingFilterProxy reconnectDelegate = new DelegatingFilterProxy("apiExceptionHandler");
return new Filter[] { reconnectDelegate, encodingFilter, new HiddenHttpMethodFilter() };
}