HttpSession原理及Session衝突
一、摘要
本文討論了web伺服器靠session id識別客戶端。以及透過原理分析session衝突的原因,發現session衝突的原因是儲存session id資訊的cookie發生了衝突。
以下說到的Session特指Web應用下的Session會話。
二、Session原理
1、什麼是Session
Session是一個服務端會話技術,利用這個技術,伺服器能夠識別與之通訊的客戶端。該客戶端與服務端互動過程中,一些資訊可以儲存在Session中。
2、Session實現原理
Web伺服器對瀏覽器的識別是建立在Cookie上面的,Session由服務端生成,其token(也就是session id)會儲存在瀏覽器上。具體的客戶端識別流程如下:
(圖1:Web伺服器識別瀏覽器流程)
當用戶使用瀏覽器訪問web服務時,web服務會查詢記憶體中是否有對應的session物件,如果有,則通過session id可以找到,如果沒有,則web服務會為瀏覽器建立一個session物件,並生成session id。session id會返回到瀏覽器上使用cookie儲存起來,瀏覽器下次請求的時候把該cookie帶上則可以被web服務識別了。
三、Session衝突出現原因及解決
1、Session衝突出現原因
在瀏覽器中,cookie的儲存是以域名進行劃分的,如:
domain a:
token1=xx;
token2=xx;
doamin b:
token1=xx;
token2=xx;
因此,如果存在兩個web應用使用同一個域名,不同埠進行訪問,剛好cookie的Key值也相同,其cookie就會出現衝突,如果這個cookie儲存的是session資訊,則session就會出現衝突。
2、Session衝突如何解決
從前面的分析可以看出,要避免session衝突,關鍵是避免cookie衝突,如果一定要使用相同的域名,則可以重新定義儲存session id資訊的cookie的key值。
在tomcat中,可以在配置檔案中修改Context標籤,新增cookieSessionName屬性,即<Context cookieSessionName=”xx”>,則可以重新定義該應用session對應的cookie key值。
如果使用其它的web server,也可以自行搜尋相關的配置修改方法,總之關鍵在於避免cookie衝突。
四、總結
整篇文章的討論是圍繞著儲存session id資訊的cookie展開的,伺服器只要能夠識別session id則能夠找到對應的session。session衝突的根源在於瀏覽器儲存的cookie的衝突,要解決session衝突的思路是重新定義cookie的key值,避免cookie衝突。