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