shiro判断session是否失效_SpringBoot + Shiro登出源码解析

本文详细探讨了在SpringBoot应用中使用Shiro进行登出操作的源码流程。从filterChainDefinitionMap配置的"/logout"开始,讲解了DelegatingSubject和DefaultWebSecurityManager的logout方法调用。重点在于如何处理session失效,包括删除记住我功能的Cookie,以及清除session中的认证和登录信息。最后,停止session并执行相关清理工作,确保用户登出成功。
摘要由CSDN通过智能技术生成

项目里面配置shiro退出的url为filterChainDefinitionMap.put("/logout",“logout”),最终会调用到org.apache.shiro.subject.support.DelegatingSubject

的logout方法,截图如下:

6dd3b4d6691fc10fb384f6ed1aa3449e.png

接着调用了org.apache.shiro.web.mgt.DefaultWebSecurityManager的logout方法,方法截图如下:

250d1c343208196a4c80881621818be0.png
362bae1a4a3f5656bd559ee20082f1a3.png

首先调用了beforeLogout方法,该方法判断项目里面是否配置了记住我的功能,如果配置了需要告诉浏览器删除存在的Cookie,截图如下:

01cf46c2aa33e6b0f8efa155427aeddb.png

先从DefaultWebSecurityManager对象成员对象获取CookieRememberMeManager对象,如果不为空,调用CookieRememberMeManager对象的onLogout方法

最终调用到SimpleCookie的removeFrom方法,截图如下:

a39aa4a273c553f5b649c97c5965182f.png

最重要的是设置Cookie的maxAge属性为0,表示要删除浏览器存在的Cookie,然后构建了一个变量headerValue,添加到response对象返回给浏览器,此方法执行

完成返回到DefaultWebSecurityManager的logout方法获取代表当前对象登录信息的对象PrincipalCollection对象,判断如果不为空,接着调用ModularRealmAuthenticator.onLogout方法,进行事件通知,回调AuthenticationListener

实现类的onLogout方法,查找所有注册了的Realm实现类,方法截图如下:

b28d74a765b260f08749d99915906e05.png

获取自定义的Realm一般都是继承自AuthorizingRealm而AuthorizingRealm间接实现了LogoutAware接口,所以对于登出时的自定义操作. 我们可以选择在自定义Realm中通过覆写onLogout来完成。

如果没有复写onLogout则调用父类方法清除用户信息。

接着调用DefaultWebSecurityManager对象的delete方法,最终调用到DefaultSubjectDAO对象的removeFromSession方法,截图如下:

77f3cb08dc56f1d946bfe4c5b2d9b846.png

首先获取session,然后移除session对象代表用户是否认证的key,该key是DefaultSubjectContext.class.getName() + “_AUTHENTICATED_SESSION_KEY”,

之后移除session对象代表用户信息的key,该key是DefaultSubjectContext.class.getName() + “_PRINCIPALS_SESSION_KEY”,至此delete方法执行完成。

最终回到DefaultWebSecurityManager对象的logout方法,进入finally代码块,执行stopSession, 停止session; 调用Shiro自身定义的Session接口的stop方法进行后续session的操作。

总结:shiro退出方法是返回浏览器一个Cookie过期的时间为maxAge=0,删除了浏览器的记住我的Cookie,删除已经登录用户的用户信息,删除session中保存用户认证和登录信息的key值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值