1. 程式人生 > 其它 >Cookie和Session的選擇,以及如何解決分散式系統下各個伺服器之間Session不統一的問題

Cookie和Session的選擇,以及如何解決分散式系統下各個伺服器之間Session不統一的問題

Cookie
什麼是Cookie:由於http協議是無狀態的,同一個瀏覽器對伺服器的兩次請求之間是沒有關係的,伺服器認為兩次請求都是全新的請求,不會記住上次請求成功的資料。然而現有的業務常常需要伺服器能記住使用者的訪問情況,而Cookie就是為了解決http協議無狀態的情況。伺服器會通過Response將cookie傳送到瀏覽器,並儲存在瀏覽器端,下次瀏覽器再向伺服器傳送請求時,會把cookie放到request裡發給伺服器。

Cookie通常設定:

public void setCooke(HttpServletResonse response){
    Cookie cookie = new
Cookie("code","message"); //存入資料 cookie.setPath("/community/alpha"); //設定cookie的請求範圍 cookie.setMaxAge(60 * 10); //設定生存時間,會儲存在本地硬碟中。 response.addCookie(cookie); //把cookie放入Response請求。 } //獲取cookie public void getCookie(@CookieValue("code") String code){ System.out.println(code); }

Cookie的弊端:Cookie將資料儲存在客戶端本地,由於本地並沒有伺服器端安全,容易造成資料的洩漏,存在安全問題。正是由於存在安全的問題,所以一些對安全性要求較高的資料是通過Session來儲存。
Session
什麼是Session:Session和Cookie類似,都是為了解決http無狀態的問題,只不過Session是將資料儲存在伺服器上,能避免資料洩漏的問題。Session底層利用了Cookie來儲存sessionid,下次瀏覽器請求伺服器時,會將sessionid帶上發給伺服器,那麼伺服器就能將請求和session對應起來。

Session的使用:

public String setSession(HttpSession session){
        session.setAttribute(
"id",1); session.setAttribute("name","test"); } //獲取session public void getSession(HttpSession session){ System.out.println(session.getAttribute("id")); System.out.println(session.getAttribute("name")); }

Session的弊端:由於session資料是存在服務端的,當用戶量較大時,每個使用者對應一份session資料,會極大的增加伺服器的記憶體負擔,所以對於安全性要求不高的資料,還是使用cookie來儲存。
分散式下的Session不同步問題
產生問題的原因:使用Nginx反向代理多臺伺服器時,會出現session不同步的問題。比如使用者通過nginx訪問伺服器1,然後將使用者資訊儲存在了伺服器1的session中,下次使用者再通過nginx訪問伺服器時,很可能會訪問到伺服器2,而伺服器2中沒有儲存該使用者的資訊,就會找不到該sessionid對應的資料,從而產生了session不同步的問題。以下是解決Session不同步的幾種解決辦法。
粘性Session:同一個IP的所有訪問請求都指定到同一個 tomcat伺服器中,這樣就解決了問題,因為一個使用者的請求都會發送到同一臺伺服器。缺點:不能實現真正的負載均衡,可能會造成某臺伺服器壓力很大。
同步Session:某一個伺服器建立session以後,會向其他伺服器同步該session,這樣所有伺服器的session就統一了。缺點:首先是所有伺服器都儲存所有的session,可能會對伺服器的效能產生影響,增大儲存的壓力,也會造成伺服器間頻繁的通訊;另一方面會增大伺服器間的耦合。

共享Session:使用一臺伺服器專門用來儲存session,其餘伺服器需要查詢session資料時就向這臺伺服器傳送請求。缺點:如果這臺session伺服器一旦宕機了,影響太大,從而產生了效能瓶頸。

通過非關係型資料庫儲存:將session資料儲存到資料庫中,由於資料庫的分散式叢集已經非常成熟,直接訪問資料庫是個比較好的選擇。為什麼不存在關係型資料庫呢,因為關係型資料庫都是將資料儲存在硬碟上,相對非關係型資料庫訪問記憶體而言速度明顯要慢很多,所以現在一般都是將session資料儲存到非關係型資料庫中。

————————————————
版權宣告:本文為CSDN博主「兩三煙樹」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/fantasy_z/article/details/105688604