目的:通过这几篇shiro源码分析,用redis代替ehache做session缓存。
相信大家对shiro也不陌生了,网上对shiro源码分析的也比较多了。笔者也看多很多优秀的博客。这几篇shiro源码分析的目的,就是弄明白,shiro是如何管理session的,如何通过redis来解决session跨域问题。一步步分析最终达到这个目的。
前言:Session和cookies
笔者想通过几个问题来解决我心中的疑惑。
1.Session创建的时间
我们第一次打开浏览器,访问某网站发起请求时,比如请求百度的首页,会返回一个Session。真正返回是执行 HttpSession session = HttpServletRequest.getSession(true)这句话时产生的。我们知道第一次访问某个网站就会产生一个session返回给客户端。
2.第一次Session获取后,以后浏览器请求是否都是同一个Session发起请求
第一次服务器返回给浏览器会产生一个session,当然可以设置过期时间,过期后重新生成session。但是session没有过期,浏览器每次请求会在请求头部上:Cookie:JSESSIONID=客户端第一次拿到的session ID。
这样就在用户登录后,以后服务器只要检测session就知道用户有没有登录,如果不是同一个session那么岂不每次都要登录。
但是是否每次请求都是同一个Session下。笔者认为同一浏览器是一致的。如果你要同个浏览器多个窗口,或者不同浏览器等等,可能会不一致。
3.Session如何删除
1.清除浏览器缓存。哈哈你好多网站都需要重新登录了。
2.Session超时删除。
3.服务器关闭。
4.Session保存在哪里
session存在服务器内存中,我们可以将它持久化,例如redi缓存下来。
我们看看第一次请求请求是没有带上session的。
第二次请求带上session,是第一次服务器返回的。
session和cookies的区别:
相信这个大家百度就有很多答案了。
shiro是如何管理session?
思考这样一个问题,如果让你做一个登录功能,如何管理用户登录状态?
1.用户第一次登录时,登录成功后,将session缓存起来,比如ehcache或者redis,设置缓存的过期时间。
2.用户点击被拦截的其他链接时。首先会获取请求中session,注意前面讲过同一浏览器会是同一个session。获得请求的session从缓存中去查找,如果存在并且缓存过期时间没有过,那么更新缓存时间。如果没有找到或者session已经过期,那么拦截成功跳到登录页面。
shiro同样是这样。当然shiro远比这复杂多了。
接下来我的分析思路是:
1.shiro如何拦截请求,如何通过session找不到缓存,跳到登录页面。
2.用户登录成功后,如何将session缓存下来。
3.如何用redis来做单点登录。
大概后续有三篇博客。
菜鸟不易,忘有问题指出,共同进步。