【022】JavaWeb面試題(三):Cookie和Session

開篇介紹

你們好,我是Java最全面試題庫提褲姐,今天這篇是JavaWeb系列的第三篇,主要總結了Java中的Cookie和Session相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。web

什麼是Cookie?

HTTP Cookie(也叫 Web Cookie或瀏覽器 Cookie)是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶併發送到服務器上。
一般,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登陸狀態。
Cookie 使基於無狀態的 HTTP 協議記錄穩定的狀態信息成爲了可能。面試

什麼是 Session?

Session 表明着服務器和客戶端一次會話的過程。
Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當客戶端關閉會話,或者 Session 超時失效時會話結束。算法

Cookie 和 Session 的區別?

Cookie
是 web 服務器發送給瀏覽器的一塊信息,瀏覽器會在本地一個文件中給每一個 web 服務器存儲 cookie。之後瀏覽器再給特定的 web 服務器發送請求時,同時會發送全部爲該服務器存儲的 cookie。
Session
是存儲在 web 服務器端的一塊信息。session 對象存儲特定用戶會話所需的屬性及配置信息。當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。後端

區別:
①存在的位置:數組

  • cookie 存在於客戶端,臨時文件夾中;
  • session存在於服務器的內存中,一個session域對象爲一個用戶瀏覽器服務

②安全性:瀏覽器

  • cookie是以明文的方式存放在客戶端的,安全性低,能夠經過一個加密算法進行加密後存放;
  • session存放於服務器的內存中,因此安全性好

③網絡傳輸量緩存

  • cookie會傳遞消息給服務器;
  • session自己存放於服務器,不會有傳送流量

④生命週期(以30分鐘爲例)安全

  • cookie的生命週期是累計的,從建立時,就開始計時,30分鐘後,cookie生命週期結束;
  • session的生命週期是間隔的,從建立時,開始計時如在30分鐘,沒有訪問session,那麼session生命週期被銷燬。可是,若是在30分鐘內(如在第29分鐘時)訪問過session,那麼,將從新計算session的生命週期。關機會形成session生命週期的結束,可是對cookie沒有影響。

⑤訪問範圍服務器

  • cookie爲多個用戶瀏覽器共享;
  • session爲一個用戶瀏覽器獨享

簡單來講cookie機制採用的是在客戶端保持狀態的方案,
而session機制採用的是在服務器端保持狀態的方案。
因爲才服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的。cookie

如何利用實現自動登陸?

當用戶在某個網站註冊後,就會收到一個惟一用戶ID的cookie。客戶後來從新鏈接時,這個用戶ID會自動返回,服務器對它進行檢查,肯定它是否爲註冊用戶且選擇了自動登陸,從而使用戶務需給出明確的用戶名和密碼,就能夠訪問服務器上的資源。

如何獲取Cookie?

一、調用request.getCookie
二、對數組進行循環,調用每一個cookie的getName方法

session的機制

session機制是一種服務器端的機制,服務器使用一種相似於散列表的結構(也可能就是使用散列表)來保存信息。
但程序須要爲某個客戶端的請求建立一個session的時候,服務器首先檢查這個客戶端的請求裏是否包含了一個session標識,稱爲session id;若是已經包含一個session id則說明之前已經爲此客戶建立過session,服務器就按照session id把這個session檢索出來使用(若是檢索不到,可能會新建一個,這種狀況可能出如今服務端已經刪除了該用戶對應的session對象,但用戶人爲地在請求的URL後面附加上一個JSESSION的參數)。
若是客戶請求不包含session id,則爲此客戶建立一個session而且生成一個與此session相關聯的session id,這個session id將在本次響應中返回給客戶端保存。

Cookie的過時和Session的超時有什麼區別?

Cookie的過時和Session的超時(過時),都是對某個對象設置一個時間,而後採用輪訓機制(或者首次訪問時)檢查當前對象是否超時(當前對象會保存一個開始時間),若是超時則進行移除。
cookie保存在瀏覽器中,不安全。而session是保存在服務端的。cookie的生命週期很長,而session很短,通常也就幾十分鐘。

cookie是保存在客戶端,session保存在服務器端,cookie保存着session相關信息。
若是cookie沒有超時,那麼瀏覽器每次請求都會帶上該cookie信息,服務器端根據cookie信息從session緩存中獲取相對應的session。這兩個信息有一個超時,用戶鏈接即宣告關閉。

會話的超時由服務器來維護,它不一樣於Cookie的失效日期。
首先,會話通常基於駐留內存的cookie,不是持續性的cookie,於是也就沒有截至日期。
即便截取到JSESSIONID cookie,併爲它設定一個失效日期發送出去。瀏覽器會話和服務器會話也會大相徑庭。

如何解決分佈式 Session 問題?

  • Nginx ip_hash策略 ,服務端使用 Nginx 代理,每一個請求按訪問 IP 的 hash 分配,這樣來自同一 IP 固定訪問一個後臺服務器,避免了在服務器 A 建立 Session,第二次分發到服務器 B 的現象。
  • Session 複製,任何一個服務器上的 Session 發生改變(增刪改),該節點會把這個 Session 的全部內容序列化,而後廣播給全部其它節點。
  • 共享 Session,服務端無狀態話,將用戶的 Session 等信息使用緩存中間件來統一管理,保障分發到每個服務器的響應結果都一致。

在單點登陸中,若是 cookie 被禁用了怎麼辦?

單點登陸的原理是後端生成一個 session ID,而後設置到 cookie,後面的全部請求瀏覽器都會帶上 cookie,而後服務端從 cookie 裏獲取 session ID,再查詢到用戶信息。
因此,保持登陸的關鍵不是 cookie,而是經過cookie 保存和傳輸的 session ID,其本質是能獲取用戶信息的數據。
除了 cookie,還一般使用 HTTP 請求頭來傳輸。可是這個請求頭瀏覽器不會像 cookie 同樣自動攜帶,須要手工處理。

session什麼時候被刪除?

session在下列狀況下被刪除:

  • 程序調用HttpSession.invalidate()
  • 距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間
  • 服務器進程被中止
注意關閉瀏覽器只會使存儲在客戶端瀏覽器內存中的session cookie失效,不會使服務器端的session對象失效。
相關文章
相關標籤/搜索