解決SpringBoot中Filter中@Autowired註解的類成員變數為NULL
阿新 • • 發佈:2018-12-21
1、問題描述
在採用SpringBoot中加入過濾器處理SSO單點登入過程中遇到所需要注入的類成員變數為Null的問題;
@Bean
public FilterRegistrationBean ssoCasRealmFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new SsoCasRealmFilter());
registration.addUrlPatterns("/*");
registration.setName ("SsoCasRealmFilter");
registration.setOrder(Integer.MAX_VALUE-4);
System.out.println("SsoCasRealmFilter");
return registration;
}
public class SsoCasRealmFilter extends CommonSSOLoginFilter {
@Autowired
private PermissionService permissionService;//此處permissionService為NULL
@Autowired
private RedisService redisService;//此處redisService為NULL
....略
}
2、問題原因
在spring中,web的載入順序是Listener->flter->servlet,所以說再在flter初始化時,相關的Bean還沒有初始化,造成了物件為空。
3、解決問題
將該自定義Filter能作為Spring Bean,以便獲得Spring Bean的相關益處,比如可以使用@Autowired進行Bean的注入等。但這裡遇到了一個問題,自定義Filter通過@Bean註解後,被Spring Boot自動註冊到了容器的Filter chain中,這樣導致的結果是,所有URL都會被自定義Filter過濾,而不是Shiro中配置的一部分URL
@Bean
public Filter ssoCasFilter(){
return new SsoCasRealmFilter();
}
@Bean
public FilterRegistrationBean ssoCasRealmFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(ssoCasFilter());
registration.addUrlPatterns("/*");
registration.setName("SsoCasRealmFilter");
registration.setOrder(Integer.MAX_VALUE-4);
System.out.println("SsoCasRealmFilter");
return registration;
}