解决Spring AOP 在RememberMeServices 导致的NullPointerException

本文探讨了Spring AOP在处理RememberMeServices时遇到的NullPointerException问题。问题源于final方法导致的AOP失效,由于cglib无法代理final方法,且此类方法内部使用了未初始化的类变量。解决方案是在类中添加一个init()方法,通过反射初始化类变量,并在应用启动时手动调用该init()方法。
摘要由CSDN通过智能技术生成

廖雪峰:AOP避坑指南
AbstractRemembermeService logger为null导致登录失败
透过现象看原理:详解Spring中Bean的this调用导致AOP失效的原因
揭秘 Spring AOP 失效的罪因,看了都说好!
Spring AOP出现NullPointerException

原因是 AbstractRememberMeServices 有一个被外部调用的final方法,cglib无法代理final方法导致的,而这个方法又使用了this+类变量,而生成cglib代理类不会初始化类变量,所以直接报 NullPointerException

@Override
public final void loginSuccess(HttpServletRequest request, HttpServletResponse response,
      Authentication successfulAuthentication) {
   
   if (!rememberMeRequested(request, this.parameter)) {
   
      this.logger.debug("Remember-me login not requested.");
      return;
   }
   onLoginSuccess(request, response, successfulAuthentication);
}

解决办法是添加一个init()方法,通过反射获取类变量并赋值

public class LogRememberMeServices extends PersistentTokenBasedRememberMeServices {
   
    @Autowired
    private LogRememberMeServices mySelf;

    public LogRememberMeServices(String key, UserDetailsService userDetailsService, PersistentTokenRepository tokenRepository) {
   
        super(key, userDetailsService, tokenRepository);
    }


    <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值