在使用Spring Security Oauth2的使用,需要在认证成功执行一些日志记录和更新的操作,所以就使用了AuthenticationSuccessEvent来进行认证成功的回调。遇到了token校验也会触发的问题也解决了,然而在每次认证请求中多次调用的问题依然没有具体的思路,而且对Spring事件监听基本上没有使用过,为了防止多次执行event 就想了一些歪点子。
@Component
public class ApplicationListenerAuthencationSuccess implements ApplicationListener<AuthenticationSuccessEvent> {
@Autowired
private UserLoginRecordService userLoginRecordService;
@Autowired
private HttpServletRequest request;
@Autowired
private UserServiceImpl userService;
private ThreadLocal<Integer> tl = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue() {
return 0;
}
};
@Override
public void onApplicationEvent(AuthenticationSuccessEvent event) {
if (tl.get().intValue() <= 0) {
//下面的判断是为了保证只有认证的时候才会执行记录日志的操作,token校验剔除
if (event.getSource().getClass().getName().equals("org.springframework.security.authentication.UsernamePasswordAuthenticationToken")) {
String username = request.getParameter("username");
//其他操作
tl.set(1);
}
}else {
tl.remove();
}
}
}
也尝试过其他方法去进行认证成功的回调但是没有成功。。。
吐槽一下:我是真的没想到,学了那么久的ThreadLocal,第一次用到这歪魔邪道上。
如果有什么好的解决办法:包括其他方式认证回调或者其他方法解决可以私信或留言= = 万分感谢!