为了账号安全,请及时绑定邮箱和手机立即绑定

注册为Spring bean时,过滤调用两次

注册为Spring bean时,过滤调用两次

隔江千里 2019-09-06 16:17:59
我想@Autowire用一个Filter。所以我在SecurityConfig下面定义我的过滤器:    @Override    protected void configure(HttpSecurity http) throws Exception {        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);        http.addFilterBefore(getA(), BasicAuthenticationFilter.class);        http.csrf().disable();    }    @Bean    public A getA(){        return new A();    }这个过滤器A扩展了Spring的GenericFilterBean。当我调用控制器时,我得到低于输出,这显示过滤器命中两次。filter A beforefilter A beforemycontroller invokefilter A afterfilter A after我的观察是,这个额外的调用使用Spring容器调用,因为如果filter没有注册为bean,它只会被命中一次。是什么原因,我该如何解决?
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

正如您所观察到的,Spring Boot将自动注册Filter与servlet容器相关的任何bean 。一种选择是不将过滤器公开为bean,只将其注册到Spring Security。


如果您希望能够将依赖关系自动装入Filter,那么它需要是一个bean。这意味着您需要告诉Spring Boot不要将其注册为过滤器。如文档中所述,您可以使用以下命令执行此操作FilterRegistrationBean:


@Bean

public FilterRegistrationBean registration(MyFilter filter) {

    FilterRegistrationBean registration = new FilterRegistrationBean(filter);

    registration.setEnabled(false);

    return registration;

}


查看完整回答
反对 回复 2019-09-06
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

有没有办法阻止Spring创建重复过滤器同时还指定过滤器顺序?我们想为一个也是bean的过滤器指定setOrder。无论我们如何处理FilterRegistrationBean,自动注册的过滤器都位于过滤器链的末尾附近。

查看完整回答
反对 回复 2019-09-06
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

这不是双重注册。通过显式提供FilterRegistrationBean禁用的过滤器,您将阻止Spring Boot创建一个已启用的过滤器。

查看完整回答
反对 回复 2019-09-06
  • 3 回答
  • 0 关注
  • 1212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信