1,spring-session使用的場景?
httpsession是通過servlet容器進行建立和管理的,在單機環境中。通過http請求建立的session資訊是儲存在web伺服器記憶體中,如tomcat/jetty。
假如當使用者通過瀏覽器訪問應用伺服器,session資訊中儲存了使用者的登入資訊,並且session資訊沒有過期失,效那麼使用者就一直處於登入狀態,可以做一些登入狀態的業務操作!
但是現在很多的伺服器都採用分布式集群的方式進行部署,乙個web應用,可能部署在幾台不同的伺服器上,通過lvs或者nginx等進行負載均衡(一般使用nginx+tomcat實現負載均衡)。此時來自同一使用者的http請求將有可能被分發到不同的web站點中去(如:第一次分配到a站點,第二次可能分配到b站點)。那麼問題就來了,如何保證不同的web站點能夠共享同乙份session資料呢?
假如使用者在發起第一次請求時候訪問了a站點,並在a站點的session中儲存了登入資訊,當使用者第二次發起請求,通過負載均衡請求分配到b站點了,那麼此時b站點能否獲取使用者儲存的登入的資訊呢?答案是不能的,因為上面說明,session是儲存在對應web伺服器的記憶體的,不能進行共享,此時spring-session就出現了,來幫我們解決這個session共享的問題!
2,如何進行session共享呢?
簡單點說就是請求http請求經過filter職責鏈,根據配置資訊過濾器將建立session的權利由tomcat交給了spring-session中的sessionrepository,通過spring-session建立會話,並儲存到對應的地方。
實際上實現session共享的方案很多,其中一種常用的就是使用tomcat、jetty等伺服器提供的session共享功能,將session的內容統一儲存在乙個資料庫(如mysql)或快取(如redis,mongo)中,
而上面說的使用nginx也可以,使用ip_hash策略。
[【nginx】實現負載均衡的幾種方式](
) 在使用nginx的ip_hash策略時候,每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問乙個後端伺服器,也可以解決session的問題。
spring官方介紹
spring會話提供了與httpsession的透明整合,允許以應用程式容器(即tomcat)中性的方式替換httpsession,但是我們從中得到了什麼好處呢?
1)集群會話——spring會話使支援集群會話變得微不足道,而不需要繫結到應用程式容器的特定解決方案。
2)多個瀏覽器會話——spring會話支援在單個瀏覽器例項中管理多個使用者會話(也就是多個經過驗證的帳戶,類似於谷歌)。
3)restful api——spring會話允許在header中提供會話id以使用restful api。
4)spring session & websockets的完美整合。
session共享問題
http協議是無狀態的 第一次訪問會生成jsessionid儲存在tomcat的concurrentmap裡伺服器,把jsessionid寫到客戶端的cookie裡面。關於cookie和session的聯絡 cookie中會包含哪些資訊 名字 值 過期時間 路徑 域 cookie會帶到http請求偷...
併發session共享問題
讓負載均衡器能夠根據每次的請求的會話標識來進行請求的 這樣就能保證每次都能落到同一臺伺服器上面,這種方式稱為session sticky方式。如下圖 存在問題 1.如果這一台web伺服器宕機或者重啟了,伺服器上的會話資料會丟失,使用者需要重新登陸等。2.會話標識是應用層的資訊,那麼負載均衡器要將同乙...
session共享問題以及解決
1.通過組播的方式進行集群間的共享,優點 web容器自身支援,配置簡單,適合小型 缺點 當一台機器的上的session變更後會將變更的資料以組播的形式分發給集群間的所有節點,對網路和所有的web容器都是存在開銷。集群越大浪費越嚴重。不能做到線性的擴充套件。2.利用共享儲存來共享session資料 所...