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

Cha*_*res 7 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[]{"/"};
    }
}
Run Code Online (Sandbox Code Playgroud)

PD我用它做过WebApplicationInitializer,但我想用AbstractAnnotationConfigDispatcherServletInitializer.

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

如果您希望此过滤器正常工作,那么最好注释掉已重写的getServletFilters方法,以便从servletContext正确地回送此过滤器.


Ana*_*sra -1

对于springSecurityFilterChain,只需将该类添加到与其他配置类相同的包中

@Order(2)
public class MyAppSecureWebAppInitializer extends
    AbstractSecurityWebApplicationInitializer {

  @Override
  protected boolean enableHttpSessionEventPublisher() {
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

AbstractSecurityWebApplicationInitializer(来自 javadocs)

注册 DelegatingFilterProxy 以在任何其他已注册 Filter 之前使用 springSecurityFilterChain。当与 AbstractSecurityWebApplicationInitializer(Class) 一起使用时,它还会注册一个 ContextLoaderListener。当与 AbstractSecurityWebApplicationInitializer() 一起使用时,通常除了 AbstractContextLoaderInitializer 的子类之外还使用此类。

默认情况下,DelegatingFilterProxy 注册时不支持,但可以通过重写 isAsyncSecuritySupported() 和 getSecurityDispatcherTypes() 来启用。

可以通过重写 afterSpringSecurityFilterChain(ServletContext) 来添加 springSecurityFilterChain 之前和之后的附加配置。

以及来自Github 中的spring security 示例

@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() };
}
Run Code Online (Sandbox Code Playgroud)