Java 如何在AbstractAnnotationConfigDispatcherServletInitializer Spring中进行过滤器映射

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<?>[]{

问题是:我可以成功注册过滤器,但不知道如何使用此特定配置设置映射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[]{"/"};
    }
}
公共类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);
}