自定义退出登录的处理,自定义退出登录逻辑
- 在demo11的基础上完善
- 解决退出登录后不能再次登录
1、配置session会话超时时长,自定义session失效处理
2、设置1个账号不能同时在2台电脑登录
3、redis实现session高可用集群、指定cookie中保存的sessionid名称
4、在实现以上3步操作后,认证通过,退出登录,这时会提示账号只能在1台电脑上登录
5、之前在《session超时不允许再次登录》这篇博客中处理不能登录的问题,解决方案是删除redis中的sessionid
7、所以这里我们要自定义退出登录的处理类,在处理类中删除redis中的sessionid
-
错误演示:首先认证成功后,redis中会保存sessionid
-
浏览器直接退出登录
http://localhost:8080/logout
-
控制台未打印sessionid,再次查看redis,不确定sessionid是否已经删除
-
修改
# 新建CustomLogoutHandler
@Component
public class CustomLogoutHandler implements LogoutHandler {
@Autowired
private SessionRegistry sessionRegistry;
@Override
public void logout(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication) {
// 退出之后 ,将对应session从缓存中清除 SessionRegistryImpl.principals
sessionRegistry.removeSessionInformation(request.getSession().getId());
}
}
# SpringSecurityConfig类中添加如下
/**
* 退出清除缓存
*/
@Autowired
private CustomLogoutHandler customLogoutHandler;
/**
* 为了解决退出重新登录问题
* @return
*/
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
.sessionRegistry(sessionRegistry())
.and()
.logout()
.addLogoutHandler(customLogoutHandler) // 退出清除缓存
.logoutUrl("/user/logout") // 退出请求路径
.logoutSuccessUrl("/mobile/page") //退出成功后跳转地址
.deleteCookies("JSESSIONID"); // 退出后删除什么cookie值;