靈感來源於:https://www.cnblogs.com/lixinjie/p/a-yuanfen-between-session-and-me.htmlhtml
在登錄時,request.getSession().setAttribute("userName", "lixinjie"),request.getSession().setAttribute("nickName", "李大胖")等。
在程序中若是要使用的話,是這樣的request.getSession().getAttribute("nickName")等。
在登出時,是這樣的request.getSession().removeAttribute("userName"),request.getSession().removeAttribute("nickName")等,終於知道用remove了。redis
來分析一下。在代碼中是這樣獲取session的,request.getSession(),這個方法的意思是當有session時就返回session,當沒有時就建立一個新的session再返回算法
1.Session是由tomcat(Servlet容器)建立的,駐留在內存裏,每一個Session都有一個惟一的Id標識,叫作session id。當用戶登錄時,這個session id會被服務器寫到cookie裏傳回客戶端。
下次這個客戶端再發起請求時就會把這個cookie帶上,tomcat從cookie裏解析出session id,而後去本身的全部session裏找,若是找到session說明他已經登錄過了,反之則沒有,要求他去登錄。spring
2.Servlet已經涵蓋了JSP技術,由於JSP最終也會被編譯爲Servlet,二者有着相同的本質。瀏覽器
解決方案一:基於Tomcat的session複製
這個解決方案其實就是當用戶請求的時候,把產生的sessionID給複製到系統全部的服務器中,這樣就能保證當用戶請求的時候從服務器A可能調用到服務器B上的模塊的時候,也能保證服務B也有該用戶的sessionID,這樣就不會再次讓用戶進行再次登陸操做了。也就解決問題了。
具體代碼中如何實現session複製呢?緩存
使用session複製的優缺點:tomcat
---------------------服務器
解決方案二:Spring Session基於Redis作session統一緩存cookie
Spring session設計思路:替換掉Servlet容器建立和管理HttpSession的實現網絡
遇到過的我問題:
隨後與客戶聯繫發現,網絡中有一個Nginx把cookie過濾掉了。因此請求到達服務器端根本就沒了cookie,因此不可能找到session,所以只能建立新的session了。
因客戶的網絡很難調整,幸運的是spring session支持把session id放入header中傳輸,至此問題得以解決。
spring session支持多種session的存儲介質,固然用的最多的應該仍是redis。你們都知道長時間不操做的話session是會過時的。咱們第一個想到的就是redis的key也支持過時時 間啊。
只要把session的過時時間設置成redis的TTL,在訪問session時更新這個TTL就好了。當你不訪問時,TTL逐漸減小到0,key過時,session也就過時了,看似很不錯。
使用Redis實現session共享的優缺點: