1. 程式人生 > >Java面試14|Session與Cookie

Java面試14|Session與Cookie

實現 不同的 url 部分 網絡 主從備份 丟失 rewrite down

1、在分布式環境,管理Session通常使用下面三種方式:

(1)Session Replication 方式管理 (即session復制)

將一臺機器上的Session數據廣播復制到集群中其余機器上

使用場景:機器較少,網絡流量較小

優點:實現簡單、配置較少、當網絡中有機器Down掉時不影響用戶訪問

缺點:廣播式復制到其余機器有一定廷時,帶來一定網絡開銷

tomcat自帶的基於tcp廣播技術的集群

(2)Session Sticky 方式管理

即粘性Session、當用戶訪問集群中某臺機器後,強制指定後續所有請求均落到此機器上

使用場景:機器數適中、對穩定性要求不是非常苛刻

優點:實現簡單、配置方便、沒有額外網絡開銷

缺點:網絡中有機器Down掉時、用戶Session會丟失、容易造成單點故障

nginx中可以通過rewrite技術將某個請求定位到某臺機器,或者也可以使用一致性hash算法來提高穩定性(當某一臺宕掉後只有部分緩存失效)

(3)緩存集中式管理

將Session存入分布式緩存集群中的某臺機器上,當用戶訪問不同節點時先從緩存中拿Session信息

使用場景:集群中機器數多、網絡環境復雜

優點:可靠性好

缺點:實現復雜、穩定性依賴於緩存的穩定性、Session信息放入緩存時要有合理的策略寫入

① 粘性session處理方式

不同的tomcat指定訪問不同的主memcached。多個Memcached之間信息是同步的,能主從備份和高可用。用戶訪問時首先在tomcat中創建session,然後將session復制一份放到它對應的memcahed上。memcache只起備份作用,讀寫都在tomcat上。當某一個tomcat掛掉後,集群將用戶的訪問定位到備tomcat上,然後根據cookie中存儲的SessionId找session,找不到時,再去相應的memcached上去session,找到之後將其復制到備tomcat上。

② 非粘性session處理方式

原理:memcached做主從復制,寫入session都往從memcached服務上寫,讀取都從主memcached讀取,tomcat本身不存儲session

參考博客:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread

2、Session與Cookie的區別與聯系

1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上

2、cookie不是很安全,由於Session是將數據保存在服務器端,只是通過Cookie傳遞一個SessionID,所以Session更適合存儲用戶隱私和重要的內容。

3、Cookie在客戶端被禁用怎麽處理?

Session URL重寫,保證在客戶端禁用或不支持cookie時,仍然可以使用session機制。session機制是一種服務器端的機制,服務器使用一種類似於散列表(HashMap)的結構(也可能就是使用散列表)來保存信息。

當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經為此客戶端創建過session,服務器就按照session id把這個session檢索出來使用(檢索不到,會新建一個)。如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存。 保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給服務器。一般這個cookie的名字都是類似於 SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。 經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。

還有一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如:

<form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" 
			value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
<input type="text"> </form>

4、Cookie在客戶端被禁用怎麽處理?

  

Java面試14|Session與Cookie