这里有几个知识点可以说一下:
cookie的失效时间
maxAge,单位为秒,有三种值:正数,负数和0
正数,则表示该cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的cookie持久化,即写到对应的cookie文件中(每个浏览器的存储位置是不一样的)。无论客户关闭了浏览器还是电脑,只要在maxAge秒之前,该cookie仍然有效。如下设置cookie永久有效:
当maxAge为负数,则表示该cookie只是一个临时的cookie,不会被持久化,仅在浏览器窗口或本窗口打开子窗口时有效,关闭浏览器后立即失效。
但maxAge为0时,立即删除cookie
session失效时间
session的过期时间是从session不活动的时候开始计算,如果session一直活动,session就总不会过期,从该Session未被访问,开始计时; 一旦Session被访问,计时清0;session超时时间设置为0则session失效,设置正数则在过了多久还没有访问为失效。
Shiro中的关系
在用shiro做登录的时候,登录超时是一个很头疼的问题。在没有配置sessionManager时,如下这个:
session的超时时间通过sever.servlet.cookie.timeout控制,如下:
如果有配置sessionManager的话,则sever.servlet.cookie.timeout失去了控制的能力,只能通过sessionManager.setGlobalSessionTimeout来控制超时时间。
总结一下:没有配置cookie中sessionid的超时时间,sessionid的超时时间默认为session(即-1),session超时或关闭浏览器就找不到session信息了。如果配置了cookie中sessionid的超时时间,则在关掉浏览器之后,只要session和sessionid没有过期,打开浏览器,还是可以取到对应的session中的信息。但是就算是配置了cookie中sessionid的超时时间,但是如果session过期了且sessionid没有过期,通过sessionid也是找不到session的。
如果配置了用redis作为session的存储容器的话。每次访问session都会执行更新redis中session的操作。每次访问session,会先访问cookie中是否有sessionid,如果没有sessionid话,就当没有session的存在,要新建session的。
如果有sessionid存在,则先去本地sessions中找是否有对应的sessionid的session,如果有的话,就返回对应的session
如果没有的话,在去redis中查找对应sessionid的session,如果有的话就返回,没有就没有了。
这里有个点,就是redis中redisvalue的超时时间最好和session的超时时间一致。因为就算redisvalue的超时时间是1个小时,但是本地session的超时时间是30分钟。在35分钟的时候,如果没有修改cookie中sessionid的时间,则sessionid在30分钟之后就不存在了,本地session也过期了,因为没有sessionid,也找不到redis中的session,就不会返回session了。
就算是将cookie中sessionid的超时时间设置为了1小时,在第35分钟的时候访问,能从redis中取出session,但是取出来的session也是过期的。因为session在存入redis的时候session会有开始时间和存活时间,取出来的时候已经超过了存活时间,是没有用的,session返回后会变为null,session也是不存在的。
用redis保存session,不能解决session超时的问题,解决的是多个服务器的问题。不同的服务器登录时,一个浏览器cookie中的sessionid是一样的,就算本地没有对应的session,但是redis中有,并且没有超时,就可以实现多个服务器都有登录状态了。