1. 程式人生 > >解決SpringBoot中Filter中@Autowired註解的類成員變數為NULL

解決SpringBoot中Filter中@Autowired註解的類成員變數為NULL

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;
}