如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器

Posted

技术标签:

【中文标题】如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器【英文标题】:Spring Boot Filter is not getting invoked if remove @component in filter class 【发布时间】:2020-06-08 00:14:00 【问题描述】:

我有两个端点,/health 和 /save。我不想为 /health 端点调用 MyFilter。 下面是代码

@Component
public class MyFilter implements Filter 

    @Autowired
    private JwtConfig jwtConfig;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // do something

        filterChain.doFilter(servletRequest, servletResponse);
    


@Configuration
@Order(2)
public class WebSecurityConfig extends DefaultSecurityConfig 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        super.configure(http);
        http.cors().and().csrf().disable().addFilterAfter(new MyFilter(), BasicAuthenticationFilter.class)
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    
    
    @Override
    public void configure(WebSecurity webSecurity) throws Exception 
        super.configure(webSecurity);
        webSecurity.ignoring().antMatchers("/health/**");
    

    @Bean
    CorsConfigurationSource corsConfigurationSource() 
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
        return source;
    

问题是如果我从 MyFilter 中删除 @component,过滤器不会被任何端点调用,如果我把它放回去,它会在两个端点中调用。如何使其仅适用于 /health 端点?

【问题讨论】:

定义一个 @Bean 方法返回您的过滤器(而不是使用 @Component)并添加一个额外的 FilterRegistrationBean 来选择应该反应的 URL。如果这需要成为 Spring Security 过滤器链的一部分,请检查过滤器内的 URL 并决定是否需要做一件事或其他。 【参考方案1】:

就在// do something 部分,检查请求的网址是否是指标,如果不是,则仅执行您的操作。该信息在HttpServletRequest 对象中很容易获得。

我不确定是否有更直接的方法可以做到这一点。使用 FilterRegistrationBean 将只允许您添加要包含的 url,而不是要排除的 url。

如果你认为你只会有这两个端点,你当然可以使用 FilterRegistrationBean 只添加你的保存端点:

@Bean
public FilterRegistrationBean<MyFilter> myFilter() 
    FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new MyFilter());
    registrationBean.addUrlPatterns("/save");
    return registrationBean;

在这种情况下,您可以删除 Component 注释。

【讨论】:

谢谢。但是将来除了 /save 之外还会有更多的端点。所以我们需要把所有东西都添加到这里吗? @sagarkancherla 你读过我回答的第一部分吗? “就在 // 做某事部分,检查请求的 url 是否是指标,如果不是,则仅执行您的操作。信息在 HttpServletRequest 对象中很容易获得。”。

以上是关于如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

搜索之后,p:dataTable将不会更新,除非调用两次搜索或者输入和清除过滤器中的某些内容

Python:如果字符串出现在列中,则删除行

SQL Server - 按可变数量的参数过滤查询

如果数据库列为空,则过滤数组 symfony 2

Indentblock CKEditor插件导致包含margin属性的样式不会出现在Styles组合中

如果从外部方法设置值,则不会调用 Vue 组件的(选择)on-change 函数