解决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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值