這里有幾個知識點可以說一下:
cookie的失效時間
maxAge,單位為秒迹栓,有三種值:正數(shù)掉分,負數(shù)和0
正數(shù),則表示該cookie會在maxAge秒之后自動失效。瀏覽器會將maxAge為正數(shù)的cookie持久化酥郭,即寫到對應的cookie文件中(每個瀏覽器的存儲位置是不一樣的)华坦。無論客戶關(guān)閉了瀏覽器還是電腦,只要在maxAge秒之前褥民,該cookie仍然有效季春。如下設置cookie永久有效:
當maxAge為負數(shù),則表示該cookie只是一個臨時的cookie消返,不會被持久化载弄,僅在瀏覽器窗口或本窗口打開子窗口時有效,關(guān)閉瀏覽器后立即失效撵颊。
但maxAge為0時宇攻,立即刪除cookie
session失效時間
session的過期時間是從session不活動的時候開始計算,如果session一直活動倡勇,session就總不會過期逞刷,從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0;session超時時間設置為0則session失效,設置正數(shù)則在過了多久還沒有訪問為失效妻熊。
Shiro中的關(guān)系
在用shiro做登錄的時候夸浅,登錄超時是一個很頭疼的問題。在沒有配置sessionManager時扔役,如下這個:
session的超時時間通過sever.servlet.cookie.timeout控制帆喇,如下:
如果有配置sessionManager的話,則sever.servlet.cookie.timeout失去了控制的能力亿胸,只能通過sessionManager.setGlobalSessionTimeout來控制超時時間坯钦。
總結(jié)一下:沒有配置cookie中sessionid的超時時間,sessionid的超時時間默認為session(即-1)侈玄,session超時或關(guān)閉瀏覽器就找不到session信息了婉刀。如果配置了cookie中sessionid的超時時間,則在關(guān)掉瀏覽器之后序仙,只要session和sessionid沒有過期突颊,打開瀏覽器,還是可以取到對應的session中的信息诱桂。但是就算是配置了cookie中sessionid的超時時間洋丐,但是如果session過期了且sessionid沒有過期,通過sessionid也是找不到session的挥等。
如果配置了用redis作為session的存儲容器的話友绝。每次訪問session都會執(zhí)行更新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會有開始時間和存活時間鹃骂,取出來的時候已經(jīng)超過了存活時間台盯,是沒有用的,session返回后會變?yōu)閚ull畏线,session也是不存在的静盅。
用redis保存session,不能解決session超時的問題寝殴,解決的是多個服務器的問題蒿叠。不同的服務器登錄時,一個瀏覽器cookie中的sessionid是一樣的蚣常,就算本地沒有對應的session市咽,但是redis中有,并且沒有超時抵蚊,就可以實現(xiàn)多個服務器都有登錄狀態(tài)了施绎。