一直對Session和Cookies的使用有點困惑,趁手上有個小需求用到了的機會學習一下。nginx
1.因爲http協議是無狀態的協議,爲了可以記住請求的狀態,因而引入了Session和Cookie的機制。
2.Session是存在於服務器端的,在單體式應用中,由Tomcat管理,而Cookie則是存在於客戶端,更方便理解的說法,能夠說存在於瀏覽器。
3.Cookie只是實現Session的其中一種方案。雖然是最經常使用的,但並非惟一的方法。
4.流程git
1.若是沒有調用request.getSession()方法,那麼服務器永遠都不會建立JSESSIONID。
2.若是調用request.getSession()方法那麼狀況分爲如下兩種狀況:github
Set-Cookie:JSESSIONID=********************************; Path=/; HttpOnly
redis
Cookie:JSESSIONID=*********************************
request.getSession()會先去獲取請求頭的JSESSIONID,而且在服務器裏面查找該ID,若是該session對象還存活(tomcat默認session的存活時間爲30分鐘,過了30分鐘後,該session對象會被銷燬)則直接獲取該session,若是該session已經被銷燬了,則從新又建立一個session對象spring
經過一個ngxin的負載均衡訪問來講明下存在的問題。
1.啓動一個nginx,負載均衡訪問到8080,8081兩個服務
2.首先訪問到了8080,帶回了set-cookies命令和sessionID
3.訪問getName接口,因爲nginx的負載均衡,此時訪問到了8081
由於Session是存儲在了Tomcat上的,而如今是兩個Tomcat,因此Session是不一樣的!瀏覽器
整合spring-session-data-redis
首先訪問到了8080,帶回了set-cookies命令和sessionID
查看redis
訪問getName接口,因爲nginx的負載均衡,此時訪問到了8081,此時沒有再生成新的sessionId
tomcat
Demo: https://github.com/WillLiaowh...服務器