SpringBoot + Shiro登出源码解析

项目里面配置shiro退出的url为filterChainDefinitionMap.put("/logout",“logout”),最终会调用到org.apache.shiro.subject.support.DelegatingSubject
的logout方法,截图如下:
在这里插入图片描述
接着调用了org.apache.shiro.web.mgt.DefaultWebSecurityManager的logout方法,方法截图如下:
在这里插入图片描述
在这里插入图片描述
首先调用了beforeLogout方法,该方法判断项目里面是否配置了记住我的功能,如果配置了需要告诉浏览器删除存在的Cookie,截图如下:
在这里插入图片描述
先从DefaultWebSecurityManager对象成员对象获取CookieRememberMeManager对象,如果不为空,调用CookieRememberMeManager对象的onLogout方法
最终调用到SimpleCookie的removeFrom方法,截图如下:
在这里插入图片描述
最重要的是设置Cookie的maxAge属性为0,表示要删除浏览器存在的Cookie,然后构建了一个变量headerValue,添加到response对象返回给浏览器,此方法执行
完成返回到DefaultWebSecurityManager的logout方法

获取代表当前对象登录信息的对象PrincipalCollection对象,判断如果不为空,接着调用ModularRealmAuthenticator.onLogout方法,进行事件通知,回调AuthenticationListener
实现类的onLogout方法,查找所有注册了的Realm实现类,方法截图如下:
在这里插入图片描述
获取自定义的Realm一般都是继承自AuthorizingRealm而AuthorizingRealm间接实现了LogoutAware接口,所以对于登出时的自定义操作. 我们可以选择在自定义Realm中通过覆写onLogout来完成。
如果没有复写onLogout则调用父类方法清除用户信息。
接着调用DefaultWebSecurityManager对象的delete方法,最终调用到DefaultSubjectDAO对象的removeFromSession方法,截图如下:
在这里插入图片描述
首先获取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值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro中,判断session是否失效可以通过以下代码实现: ```java Subject subject = SecurityUtils.getSubject(); if (subject != null) { Session session = subject.getSession(false); if (session == null) { // session已经失效 } } ``` 上述代码中,首先通过`SecurityUtils.getSubject()`获取`Subject`对象,再通过`subject.getSession(false)`获取当前用户的`Session`对象,如果返回值为`null`,则表示`Session`已经失效。 当然,也可以通过在Shiro配置文件中配置`sessionManager`,设置`sessionValidationSchedulerEnabled`参数为`true`,开启Shiro的`Session`定期检查功能,实现自动检测`Session`是否失效。 另外,在Spring Boot中集成Shiro时,可以通过实现`SessionListener`接口,监听`Session`的创建、销毁和过期事件,并在事件触发时执行相应的操作。具体可参考以下代码示例: ```java @Component public class MySessionListener implements SessionListener { @Override public void onStart(Session session) { // Session创建时触发 } @Override public void onStop(Session session) { // Session销毁时触发 } @Override public void onExpiration(Session session) { // Session过期时触发 } } ``` 在以上代码中,实现了`SessionListener`接口,并在各个方法中编写相应的操作代码,以实现对`Session`的监听。最后,在Spring Boot配置文件中配置`shiro.sessionListeners`参数,将自定义的`SessionListener`注册到Shiro中即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值