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

时间:2014-08-08 17:47:26

标签: java spring servlet-filters spring-java-config

问题在于:我可以成功注册过滤器,但不知道如何使用此特定配置设置映射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

2 个答案:

答案 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() };
}