通常所說的cookie實際上可以分為2種,一種是由Cookie對象產生的保存在客戶端硬盤上的持久化的cookie,另一種就是由session對象產生的保存在瀏覽器內存里的session cookie.session cookie的組成是形如: JSESSIONID=0EB8CEDE030A4B6FB5366317D8BF1978(tomcat下).Session cookie何時產生?當新創建一個session對象時產生session cookie.當使用request.getSession()或request.getSession(true)方法時,如果請求范圍內根據jsessionid能夠找到一個對應的session對象,則不產生session cookie也不返回給客戶端保存,找不到則新創建一個session cookie并生成一個形如JSESSIONID=0EB8CEDE030A4B6FB5366317D8BF1978(tomcat下)的session cookie并放在本次響應頭信息中返回給客戶端保存,客戶端之前保存的session cookie也將被這個session cookie所代替.與session cookie不同的是,如果服務器端明確使用Cookie類來生成的持久化cookie將在每次響應中返回給客戶端保存,不管客戶端是否存在這個cookie.當瀏覽器接受cookie后(不管是持久化cookie還是session cookie),在對同一站點進行訪問時,會自動把這些cookie信息放在請求頭信息中一起發送給服務器端.這樣服務器端就能得到這些cookie來跟蹤會話.向服務器端發送cookie這個過程對用戶來是完全透明的,是瀏覽器自動進行的.
以上討論是在瀏覽器接受cookie的情況下,下面談談瀏覽器禁用cookie的情況.
如果瀏覽器禁用了cookie,那么瀏覽器不會接收保存服務器端存在響應頭中的cookie信息(ie6有bug,會保存session cookie).瀏覽器再次訪問同一站點時,請求頭信息里也不會攜帶任何cookie信息的(因為瀏覽器根禁止了該功能).正因如此,服務器端接收不到客戶端的cookie信息,也就無法識別客戶端的身份,從而把它當作一個新的客戶對待,也就會丟失以前的會話信息.在這種情況下服務器端使用request.getSession()或request.getSession(true)方法時將會重新創建一個session.
那么如何在用戶禁用了cookie的情況下維護會話呢?以上討論我們已經知道,服務器端判斷是新的會話還是舊的會話是根據請求頭中是否有一個jsessionid的.由于瀏覽器禁用了cookie從而不會自動向服務器發送這個參數,那么要維持會話就需要我們自己每次服務器發送請求時帶上這個參數.url重寫正是這樣一種技術,只要在我們的代碼中把所有向服務器發送請求的地方用response.encodeRedirectUrl(String
arg0)包裝一下,這樣我們請求的url就會自動加上當前session對象產生的jsessionid.服務器端也能取得這個值從而識別客戶端.
posted on 2009-04-14 23:59
zhangchao 閱讀(884)
評論(0) 編輯 收藏 所屬分類:
web開發