Web中的Session和Cookie回顧
由于HTTP協(xié)議是無狀態(tài)的協(xié)議,一次瀏覽器和服務(wù)器的交互過程就是:
瀏覽器:你好嗎?
服務(wù)器:很好!
這就是一次會話,對話完成后,這次會話就結(jié)束了,服務(wù)器端并不能記住這個人,下次再對話時,服務(wù)器端并不知道是上一次的這個人,所以服務(wù)端需要記錄用戶的狀態(tài)時,就需要用某種機制來識別具體的用戶,這個機制就是Session。
服務(wù)端如何識別特定的客戶?
這個時候需要使用Cookie。每次HTTP請求的時候,客戶端都會發(fā)送相應(yīng)的Cookie信息到服務(wù)端。
實際上大多數(shù)的應(yīng)用都是用 Cookie 來實現(xiàn)Session跟蹤的,第一次創(chuàng)建Session時,服務(wù)端會在HTTP協(xié)議中向客戶端 Cookie 中記錄一個Session ID,以后每次請求把這個會話ID發(fā)送到服務(wù)器,這樣服務(wù)端就知道客戶端是誰了。
那么如果客戶端的瀏覽器禁用了 Cookie 怎么辦?
一般這種情況下,會使用一種叫做URL重寫的技術(shù)來進行session會話跟蹤,即每次HTTP交互,URL后面都會被附加上一個諸如 sessionId=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識別客戶端是誰。
在Web項目開發(fā)中,Session會話管理是一個很重要的部分,用于存儲與記錄用戶的狀態(tài)或相關(guān)的數(shù)據(jù)。
通常情況下session交由容器(tomcat)來負責(zé)存儲和管理,但是如果項目部署在多臺tomcat中,則session管理存在很大的問題;
多臺tomcat之間無法共享session,比如用戶在tomcat A服務(wù)器上已經(jīng)登錄了,但當(dāng)負載均衡跳轉(zhuǎn)到tomcat B時,由于tomcat B服務(wù)器并沒有用戶的登錄信息,session就失效了,用戶就退出了登錄;
一旦tomcat容器關(guān)閉或重啟也會導(dǎo)致session會話失效;
因此如果項目部署在多臺tomcat中,就需要解決session共享的問題。
在Web項目開發(fā)中,Session會話管理是一個很重要的部分,用于存儲與記錄用戶的狀態(tài)或相關(guān)的數(shù)據(jù)。
通常情況下session交由容器(tomcat)來負責(zé)存儲和管理,但是如果項目部署在多臺tomcat中,則session管理存在很大的問題:
• 多臺tomcat之間無法共享session,比如用戶在tomcat A服務(wù)器上已經(jīng)登錄了,但當(dāng)負載均衡跳轉(zhuǎn)到tomcat B時,由于tomcat B服務(wù)器并沒有用戶的登錄信息,session就失效了,用戶就退出了登錄;
• 一旦tomcat容器關(guān)閉或重啟也會導(dǎo)致session會話失效;
因此如果項目部署在多臺tomcat中,就需要解決session共享的問題。
第一種:是使用容器擴展插件來實現(xiàn),比如基于Tomcat的tomcat-redis-session-manager插件,基于Jetty的jetty-session-redis插件、memcached-session-manager插件;這個方案的好處是對項目來說是透明的,無需改動代碼,但是由于過于依賴容器,一旦容器升級或者更換意味著又得重新配置;其實底層是,復(fù)制session到其它服務(wù)器,所以會有一定的延遲,也不能部署太多的服務(wù)器。
第二種:是使用Nginx負載均衡的ip_hash策略實現(xiàn)用戶每次訪問都綁定到同一臺具體的后臺tomcat服務(wù)器實現(xiàn)session總是存在這種方案的局限性是ip不能變,如果手機從北京跳到河北,那么ip會發(fā)生變化;另外負載均衡的時候,如果某一臺服務(wù)器發(fā)生故障,那么會重新定位,也會跳轉(zhuǎn)到別的機器。
第三種:是自己寫一套Session會話管理的工具類,在需要使用會話的時候都從自己的工具類中獲取,而工具類后端存儲可以放到Redis中,這個方案靈活性很好,但開發(fā)需要一些額外的時間。
第四種:是使用框架的會話管理工具,也就是我們要介紹的Spring session,這個方案既不依賴tomcat容器,又不需要改動代碼,由Spring session框架為我們提供,可以說是目前非常完美的session共享解決方案。