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方法中手动调用。
浙公网安备 33010602011771号