将过滤器 bean 添加到 ServletContext

Posted

技术标签:

【中文标题】将过滤器 bean 添加到 ServletContext【英文标题】:Add Filter bean to ServletContext 【发布时间】:2016-02-11 05:36:43 【问题描述】:

我正在使用 Java 配置并且知道我可以像这样添加自定义过滤器:

@Override
public void onStartup(final ServletContext servletContext) throws ServletException 
    super.onStartup(servletContext);
    DelegatingFilterProxy filter = new DelegatingFilterProxy("springSecurityFilterChain");
    filter.setServletContext(servletContext);
    filter.setContextAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher");
    servletContext.addFilter("corsFilter", CorsFilter.class).addMappingForUrlPatterns(null, false, "/*");
    servletContext.addFilter("springSecurityFilterChain", filter).addMappingForUrlPatterns(null, true, "/*");

这工作正常,但感觉就像我在 Spring 的边缘进行黑客攻击。

我想做的是将我的 CORS 过滤器添加到DelegationFilterProxy。

在我的根配置中我添加了:

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public Filter CorsFilter() 
    return new CorsFilter();

并删除了 onStartup 中自定义过滤器的添加。现在它根本不起作用。

如何将 bean 添加到我的过滤器链并确保首先调用它?

【问题讨论】:

我找不到任何东西来确保首先应用 CORS 过滤;你确定这是必要的吗? 用于安全端点 您的第二个代码 sn-p 应该可以工作。包含类是否使用 @Configuration 注释? 是的。我还确保一直在根上下文中 【参考方案1】:

您可以像在 onStartUp() 方法中添加 springSecurityFilteChain 一样添加它,例如...

@Override
public void onStartup(final ServletContext servletContext) throws ServletException 
    super.onStartup(servletContext);
    DelegatingFilterProxy filter1 = new DelegatingFilterProxy("springSecurityFilterChain");
    filter1.setServletContext(servletContext);
    filter1.setContextAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher");
    DelegatingFilterProxy filter2 = new DelegatingFilterProxy("corsFilter");
    servletContext.addFilter("springSecurityFilterChain", filter1).addMappingForUrlPatterns(null, true, "/*");
    servletContext.addFilter("corsFilter",filter2).addMappingForUrlPatterns(null, false, "/*");

【讨论】:

我希望能够不使用 DelegatingFilterProxy,但这似乎是最好的解决方案。【参考方案2】:

要使用 Java 配置简单地全局启用 CORS 过滤器,请尝试以下操作:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#javaconfig

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter 

    @Override
    public void addCorsMappings(CorsRegistry registry) 
        registry.addMapping("/**");
    

【讨论】:

此 corsMappiing 仅在所有安全过滤器之后应用...因此您将收到 401 错误,除非您特别允许在所有端点上使用 now 凭据的 OPTIONS

以上是关于将过滤器 bean 添加到 ServletContext的主要内容,如果未能解决你的问题,请参考以下文章

将@Component 添加到自定义 Spring Security 过滤器的含义是啥

如何以编程/动态方式将组件添加到 p:dataTable facet

Spring将请求范围的bean提升到子线程(HttpServletRequest)

在过滤器 bean 类中使用一些 bean?

如何将 bean 注入 Undertow 中的 servlet 过滤器?

功能 bean 定义 Kotlin DSL - 将初始化程序添加到单个测试类?