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