Session Cookies 你懂了嗎

一直對Session和Cookies的使用有點困惑,趁手上有個小需求用到了的機會學習一下。nginx

基礎知識

1.因爲http協議是無狀態的協議,爲了可以記住請求的狀態,因而引入了Session和Cookie的機制。
2.Session是存在於服務器端的,在單體式應用中,由Tomcat管理,而Cookie則是存在於客戶端,更方便理解的說法,能夠說存在於瀏覽器。
3.Cookie只是實現Session的其中一種方案。雖然是最經常使用的,但並非惟一的方法。
4.流程git

  • 首先,客戶端會發送一個http請求到服務器端。
  • 服務器端接受客戶端請求後,創建一個session,併發送一個http響應到客戶端,這個響應頭,其中就包含Set-Cookie頭部。該頭部包含了sessionId。
  • 在客戶端發起的第二次請求,假如服務器給了set-Cookie,瀏覽器會自動在請求頭中添加cookie
  • 服務器接收請求,分解cookie,驗證信息,覈對成功後返回response給客戶端

image.png

代碼示例

image.png
image.png
image.png

1.若是沒有調用request.getSession()方法,那麼服務器永遠都不會建立JSESSIONID。
2.若是調用request.getSession()方法那麼狀況分爲如下兩種狀況:github

  • 若是是第一次訪問,那麼request.getSession()會建立一個JSESSIONID,而且在響應頭裏面有設置:

Set-Cookie:JSESSIONID=********************************; Path=/; HttpOnlyredis

  • 若是不是第一訪問,那麼這次瀏覽器訪問該項目的時候,請求頭會帶有:

Cookie:JSESSIONID=*********************************
request.getSession()會先去獲取請求頭的JSESSIONID,而且在服務器裏面查找該ID,若是該session對象還存活(tomcat默認session的存活時間爲30分鐘,過了30分鐘後,該session對象會被銷燬)則直接獲取該session,若是該session已經被銷燬了,則從新又建立一個session對象spring

分佈式狀況下的Session

經過一個ngxin的負載均衡訪問來講明下存在的問題。
1.啓動一個nginx,負載均衡訪問到8080,8081兩個服務
image.png
image.png
2.首先訪問到了8080,帶回了set-cookies命令和sessionID
image.png
3.訪問getName接口,因爲nginx的負載均衡,此時訪問到了8081
image.png
由於Session是存儲在了Tomcat上的,而如今是兩個Tomcat,因此Session是不一樣的!瀏覽器

整合spring-session-data-redis
image.png
image.png
image.png
首先訪問到了8080,帶回了set-cookies命令和sessionID
image.png
查看redis
image.png
訪問getName接口,因爲nginx的負載均衡,此時訪問到了8081,此時沒有再生成新的sessionId
image.pngtomcat

Demo: https://github.com/WillLiaowh...服務器

相關文章
相關標籤/搜索