session由tomcat管理,session可以理解為乙個物件,我們可以通過request.getsession()獲取session物件。可以呼叫setattribute和getattribute設定session的屬性,例如cookie就是通過setattribute放入session中的。
session的出現是為了使用者登入成功後,進行其他操作的請求,請求被***攔截後,通過校驗session,可以正常訪問。
所以單台伺服器只有乙個tomcat不會出現問題,但是對於集群,多個tomcat,我們的目標是保持session的一致,否則會出問題。
從架構方面來說,多個tomcat應用伺服器前面必須有乙個nginx反向**伺服器,實現負載均衡。
乙個使用者的第一次登入請求經過nginx訪問到tomcata,此時tomcata中有了session,第二次請求經過nginx訪問到tomcatb,b的session還不存在,則第二次請求會被攔截,跳轉到登入頁面,使用者體驗非常不好。
共有三種解決方法
1.粘性session,通過配置nginx的ip_hash屬性,某一使用者的所有請求都會打到同一伺服器上,缺點tomcat掛掉,則對應的使用者組都受到影響
2.session複製,通過配置tomcat server檔案,所有tomcat每個都有全部使用者的session,缺點session複製需要耗費效能,大量session耗費伺服器資源
3.將session存放到redis中,通過配置專案的webxml和spring的xml實現,最常用的方法。
分布式session共享
為什麼會出現session共享問題?客戶端與伺服器互動時會產生唯一的sessionid用於標記使用者,但是在分布式架構中,如果還是採用 session 的方式,使用者發起請求,通過 nginx 做請求 時,並不知道是 到伺服器1還是伺服器2,所以就會出現session共享問題。今天主要記錄使用 sp...
分布式session共享
什麼是session 伺服器為每個使用者建立乙個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同乙個上下文。當使用者請求來自應用程式的 web 頁時,如果該使用者還沒有會話,則 web 伺服器將自動建立乙個 session 物件。當會話過期或被放棄後,伺服器將終止該會話並銷毀。分布式sessio...
shiro分布式session共享
使用nginx tomcat進行負載均衡時,希望使用輪詢方式進行負載。但是如果使用輪詢方式的話,可能會訪問不同的tomcat,此時如果不進行session共享,則相當於是乙個新的session。就比如現有系統都是需要認證登入的系統,如果沒有session共享,則會導致使用者退出登入。當我們使用了ng...