提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、shiro保持登录状态的方式?
  • 二、具体过程
  • 1.登录系统
  • 2.关闭浏览器
  • 3.登出系统
  • 4.RememberMe功能

前言

最近一段时间在研究shiro框架,发现网上很少有讲在登录之后,shiro是如何保持登陆状态的,或者换句话说就是后台服务能够在你登录之后,知道你是谁,知道你有哪些权限,知道你的角色是什么


一、shiro保持登录状态的方式?

现在大部分的web项目都是采用前后端分离的架构,而保持登录状态采用的最多的方式是请求后端服务时,在请求的Header中携带token(token是在登录成功后端所返回的身份凭证)。而本文所介绍的是shiro中传统的通过cookie-session来保持登录状态的方式。

二、具体过程

1.登录系统

在首次访问登录管理系统时,后台服务会在响应头中向浏览器设置一个cookie,而cookie的内容中的JSESSIONID就是在本次http会话中,后台服务所存储的sessionId。

session保持登录状态 session怎么保持登录状态_redis

在登录成功后,浏览器的每次请求都会携带这个cookie。

session保持登录状态 session怎么保持登录状态_java_02

这个cookie就相当于当前登录用户的身份凭证,我们可以利用这个cookie去访问当前用户在这个系统中被授权的接口。

session保持登录状态 session怎么保持登录状态_java_03

在不携带cookie时,请求会被shiro过滤器过滤掉。

session保持登录状态 session怎么保持登录状态_后端服务_04

我在代码中将session信息存储到了redis中,session中存储了该登录用户的身份。

session保持登录状态 session怎么保持登录状态_后端服务_05


session保持登录状态 session怎么保持登录状态_redis_06

如果将这条session记录从redis中删除,登录状态将会失效。

session保持登录状态 session怎么保持登录状态_java_07

2.关闭浏览器

因为shiro中的session机制是使用进程中的cookie来保存sessionId,所以关闭浏览器后,这个进程将会消失。所以在下次打开浏览器访问该系统时,后端服务将会给浏览器设置一个新的cookie。但是redis中,上次登录所产生的session并没有被删除,所以可以继续使用上次登录所产生的sessionId来访问登录用户所被授权的接口。

3.登出系统

登出系统后,redis中会把该次会话的session删除。这个sessionId将无法访问登出用户所授权的接口。通过源码可以看到,登出操作会把session信息清空。

session保持登录状态 session怎么保持登录状态_java_08

4.RememberMe功能

在上面的第二点中,我们得知当用户关闭浏览器之后,在重新打开浏览器访问之前所登录的系统,需要重新登录。

shiro提供了RememberMe功能,就是为了解决重新登录问题。

在选择开启rememberMe之后,后台服务在给浏览器的cookie中会添加rememberMe信息。

session保持登录状态 session怎么保持登录状态_java_09

在重新打开浏览器访问该服务时,还是会携带该rememberMe信息,而后端服务也是通过rememberMe的信息来确认登录的用户身份。

在重新打开浏览器访问该服务时,后端服务会给浏览器设置一个新的sessionId和rememberMe。

session保持登录状态 session怎么保持登录状态_session保持登录状态_10