Session的理解

靈感來源於: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,二者有着相同的本質。瀏覽器

3.Session建立的時間是:
一個常見的誤解是覺得session在有客戶端訪問時就被建立,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被建立,注意若是JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來歷。
因爲session會消耗內存資源,所以,若是不打算使用session,應該在全部的JSP中關閉它。
 
4.Session刪除的時間是:
1)Session超時:超時指的是連續必定時間服務器沒有收到該Session所對應客戶端的請求,而且這個時間超過了服務器設置的Session超時的最大時間。
2)程序調用HttpSession.invalidate()
3)服務器關閉或服務中止
 
5.session存放在哪裏:服務器端的內存中。不過session能夠經過特殊的方式作持久化管理。
 
6.session的id是從哪裏來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會爲客戶端建立一個session,並將經過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求後就獲得該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,
 
 
Session共享的幾種方案
 
 

解決方案一:基於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也就過時了,看似很不錯。

 
  tomcat+redis實現session共享的方案,當tomcat建立session後會把它存入redis,獲取session時會去redis裏把它讀出來,修改session後會從新把它更新到redis裏。
    再基於Redis的特性進行設置一個失效時間的機制,這樣就能保證用戶在咱們設置的Redis中的session失效時間內,都不須要進行再次登陸。

 使用Redis實現session共享的優缺點:

相關文章
相關標籤/搜索