这篇博客就来写一写之前学习shiro框架整合的时候,产生的一些问题,相信大家在学习的时候也有相应的一些疑惑。接下来就针对shiro中的session和cookie来捋一捋。 shiro整合学习的总结
······················································································································································· 个人博客:http://z77z./ 此项目下载地址:https://git.oschina.net/z77z/springboot_mybatisplus ······················································································································································· sessionsession是大家比较熟悉的功能,因为HTTP协议是无状态的,网站为了在多个请求之间传递数据就使用了session这个东西,session是存储在网站服务器上的某个地方,比如内存、数据库或者其他的什么东西,在我的配置中是用redis存储的,因为我使用了Shiro的Native Session Manager,替代了Tomcat本身的Session Manager,并且为Shiro的Native Session Manager配置了redis的SessionDAO,当然这个我是直接使用的一个开源插件,里面已经帮我们很好的实现了cacheManager,sessionManager,redisSessionDAO这些。直接使用就可以了。 shiro_redis插件地址:http://www.oschina.net/p/shiro-redis 所以所有的session会话都是缓存在redis里面的。对session的增删改查都是在操作redis数据库来完成。所以如果将redis进行集群的话,session会话也就会达到集群的目的。后面我专门写博客来分享。 在这种情况下服务器的Session就存储在redis里面,如果某个Session过期(比如关闭了浏览器或者超时),此条Session就会从redis里面永久删除,下次的请求将不能使用Session里面的数据。所以说即使有些url设置的是”user”级别的(也就是说不用登录即可访问,只须设置了rememberMe),但是如果这些url使用了Session里面的数据,就会抛出异常,因为此时这个用户对应的Session已经不存在了。 cookie当浏览一个网站的时候,网站返回给你一个Session Cookie和一个RememberMe Cookie,Session Cookie很好理解,就是为了此次的对话,一旦关闭了浏览器或者超时了Session Cookie就没用了。但是RememberMe Cookie不太一样,Shiro默认的RememberMe Cookie的时长是一年,所以不用担心这个Cookie的情况。RememberMe Cookie实际就是Shiro把这个用户的信息加密一下放到cookie里面,下次就可以根据这个cookie来进行判断这是哪个用户。 主要讲下shiro的rememberMe cookie。在shiro中有一个类实现了rememberMe功能, org.apache.shiro.web.mgt.CookieRememberMeManager 。在登录时,代码也很简单:
RememberMe这个参数设置为true后,在登陆的时候就会在客户端设置remenberme的相应cookie。下次访问带上这个cookie,访问链接为user链接器的,就不需要进行登录验证,直接进入权限验证。下面是完整的处理过程:
这样不需要进入身份验证的拦截器,就直接从cookie中获取到了登录信息。 未解决疑惑session整个流程很好理解,我们使用的插件,对session的操作理解可以去看我之前写的在线用户管理和控制在线人数功能,基本都是对session的操作。 https://my.oschina.net/z707z/blog/852189 对于cookie我又下面几点疑惑,忘大神指点:
网上找了一个思路:
这样处理有一个不好的地方就是:必须要每次用户要再次操作的时候才会发现cookie被盗用,如果被盗用的cookie是用户最后一次操作生成的cookie呐。 我到觉得控制用户登录人数为只能一个人登录一个账号,还比上面这个方便些,不会反复的生成cookie,写入cookie。但是也不好,没有解决服务器上的cookie没有根据用户的退出而失效的这个问题。 |
|