提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、shiro保持登录状态的方式?
- 二、具体过程
- 1.登录系统
- 2.关闭浏览器
- 3.登出系统
- 4.RememberMe功能
前言
最近一段时间在研究shiro框架,发现网上很少有讲在登录之后,shiro是如何保持登陆状态的,或者换句话说就是后台服务能够在你登录之后,知道你是谁,知道你有哪些权限,知道你的角色是什么
一、shiro保持登录状态的方式?
现在大部分的web项目都是采用前后端分离的架构,而保持登录状态采用的最多的方式是请求后端服务时,在请求的Header中携带token(token是在登录成功后端所返回的身份凭证)。而本文所介绍的是shiro中传统的通过cookie-session来保持登录状态的方式。
二、具体过程
1.登录系统
在首次访问登录管理系统时,后台服务会在响应头中向浏览器设置一个cookie,而cookie的内容中的JSESSIONID就是在本次http会话中,后台服务所存储的sessionId。
在登录成功后,浏览器的每次请求都会携带这个cookie。
这个cookie就相当于当前登录用户的身份凭证,我们可以利用这个cookie去访问当前用户在这个系统中被授权的接口。
在不携带cookie时,请求会被shiro过滤器过滤掉。
我在代码中将session信息存储到了redis中,session中存储了该登录用户的身份。
如果将这条session记录从redis中删除,登录状态将会失效。
2.关闭浏览器
因为shiro中的session机制是使用进程中的cookie来保存sessionId,所以关闭浏览器后,这个进程将会消失。所以在下次打开浏览器访问该系统时,后端服务将会给浏览器设置一个新的cookie。但是redis中,上次登录所产生的session并没有被删除,所以可以继续使用上次登录所产生的sessionId来访问登录用户所被授权的接口。
3.登出系统
登出系统后,redis中会把该次会话的session删除。这个sessionId将无法访问登出用户所授权的接口。通过源码可以看到,登出操作会把session信息清空。
4.RememberMe功能
在上面的第二点中,我们得知当用户关闭浏览器之后,在重新打开浏览器访问之前所登录的系统,需要重新登录。
shiro提供了RememberMe功能,就是为了解决重新登录问题。
在选择开启rememberMe之后,后台服务在给浏览器的cookie中会添加rememberMe信息。
在重新打开浏览器访问该服务时,还是会携带该rememberMe信息,而后端服务也是通过rememberMe的信息来确认登录的用户身份。
在重新打开浏览器访问该服务时,后端服务会给浏览器设置一个新的sessionId和rememberMe。