SpringBoot 让 Filter 能注入依赖的Bean,但不会自动注册为 全局Filter

问题:

Filter 使用 @Componet 或者  @WebFilter 时,会被SpringBoot 自动 注册为全局Filter,启动的时候会出来,该类Filter会对所有请求进行 Url匹配检查,再判断是否需要执行Filter处理。

 

但有时候我们的Filter并不想注册为全局Filter,这些Filter只是为授权服务器(AuthorizationServer)或者 资源服务器(ResourceServer)服务,只希望他们在这些范畴的FilterChain中进行处理操作。

SpringBoot启动时也会将这些FilterChain打印出来:

我们希望这些Filter只出现在这些 FilterChain中。

 

做法:

很简单,不作为Bean即可。不作为Bean,SpringBoot就不会处理他们,自然也不会自动注册为Filter。

但我又希望这些Filter中能自动注入 我所需要的 那些Spring的bean,这样才方便,怎么办呢?

 

解决:

使用Factory去生成这些Filter。

@Componentpublic class XXXFilterBeanFactory implements FactoryBean<XXXFilter> {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public SSOSessionFilter getObject() throws Exception {
        XXXFilter filter=  new XXXFilter();
        filter.setObjectMapper(this.objectMapper);

        ssf.init();     //手动调用初始化方法
        return ssf;
    }

    @Override
    public Class<?> getObjectType() {
        return XXXFilter.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

将Facotry用@Component进行修饰,这样就可以注入依赖的Bean了。

 

注意:

这样产生的Filter是不会执行 Filter接口的 init(FilterConfig filterConfig) 方法的。

所以我们需要自己建一个 init()方法,将需要初始化的工作放在里面执行,然后在 Factory的 getObject方法中手动调用。

 

posted on 2019-04-22 12:59  HB1  阅读(1165)  评论(0)    收藏  举报

导航