沒有眼淚
          Don't Cry!
          posts - 13,comments - 44,trackbacks - 0
          通常所說的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信息(ie6bug,會保存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ā)

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 象山县| 托克托县| 长葛市| 桂平市| 通江县| 衡山县| 鄂温| 镇江市| 苍梧县| 龙里县| 绥芬河市| 毕节市| 贡觉县| 绥德县| 峨眉山市| 吉首市| 永福县| 即墨市| 静海县| 五家渠市| 景洪市| 卢氏县| 三河市| 昭觉县| 阿城市| 永年县| 茂名市| 兰坪| 双峰县| 专栏| 巴南区| 和政县| 林甸县| 黎平县| 额尔古纳市| 兰西县| 大冶市| 烟台市| 蚌埠市| 霍邱县| 金湖县|