2009年5月18日 星期一

cookie跟session

Session是Server端的一種狀態機制,目的是為了克服了HTTP的一些限制並允許網絡Client端及Server端維護請求間的關係。在這種關係維持的期間叫做session。

Cookies是Server端在Client端機器上,存儲的記錄並隨每一個請求發送至同一個服務器。網絡服務器用HTTP頭向客戶端發送cookies,在客戶終端,瀏覽器解析這些cookies並將它們保存為一個本地文件,它會自動將同一服務器的任何請求縛上這些cookies。(IETF RFC 2965 HTTP State Management Mechanism 是通用cookie規範)

Session ID,當網頁程式需要為某個客戶端的請求建立一個session時,服務器首先檢查這個客戶端的請求裡是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,服務器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個 session id將被在本次響應中返回給客戶端保存。
保存這個session id的方式可以採用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給服務器。一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

由於cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現形式為http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一種是作為查詢字符串附加在URL後面,表現形式為http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764這兩種方式對於用戶來說是沒有區別的,只是服務器在解析的時候處理的方式不同,採用第一種方式也有利於把session id的信息和正常程序參數區分開來。為了在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個session id。

Session會佔用Server端資源,所以可以設定每個Session閒置時間,超過設定時間就會被回收,也就是一般常見的錯誤訊息--連線逾時(Session Time Out)。但並非所有出現此錯誤都是Session超過閒置時間,如果Client端沒有回給Server端正確的Cookie,導致Session無法獲得正確狀態資訊,也會出現此錯誤。如:Proxy的問題,transparent proxy 有好幾台,然後每回連線如果是不同的 proxy 就會造成 session 無效自動登出

解決方式:瀏覽器 → 工具→ 網際網路選項 → 隱私 → 進階 → 複寫自動 cookie 處理

另外如果常被Server自動登出,解決方式有

瀏覽器 → 工具→ 網際網路選項 → 一般 → 刪除Cookie

瀏覽器 → 工具→ 網際網路選項 → 隱私 → 中

瀏覽器 → 工具→ 網際網路選項 → 隱私 → 編輯(XP為"網站") → 檢查是否有設定受管制網址

將信任的網站加入到信任網站(安全層級比較低)

勾選【自動登入】

沒有留言:

張貼留言