HTTP代理如何正确处理Cookie(1)
HTTP代理如何正確處理Cookie(1) - 轉(zhuǎn)載(寫的比較詳細,并以實例講解) http://hi.baidu.com/bdui/blog/item/17a584033723308bd43f7ca7.html 2007-12-09 19:36
| 大多數(shù)的 Web 應(yīng)用程序都要求維護某種會話狀態(tài),如用戶購物車的內(nèi)容。這種會話狀態(tài)的保持很多情況下需要借助于Cookie或者Session的幫助。本文結(jié)合在線頁面 翻譯 (Machine Translation System)項目中對于Cookie的處理方法,探討一下如何在HTTP應(yīng)用代理中正確處理Cookie的傳遞和管理問題。 讀者定位為具有Java和Web開發(fā)經(jīng)驗的開發(fā)和設(shè)計人員。 讀者可以學(xué)習(xí)到關(guān)于Cookie的工作原理和Cookie協(xié)議的細節(jié),以及在一個HTTP應(yīng)用代理的場景下Cookie的管理和處理思想,并可以直接使用文中的代碼和思路,提高工作效率。 隨著越來越多的系統(tǒng)移植到了Web上,HTTP協(xié)議具有了比以前更廣泛的應(yīng)用。不同的系統(tǒng)對WEB實現(xiàn)提出了不同的要求,基于HTTP協(xié)議的網(wǎng)絡(luò)應(yīng) 用正趨于復(fù)雜化和多元化。很多應(yīng)用需要把用戶請求的頁面進行處理后再返回給用戶,比如頁面關(guān)鍵字過濾,頁面內(nèi)容緩存、內(nèi)容搜索、頁面翻譯等等。這些應(yīng)用在 實際效果上類似于一個HTTP應(yīng)用代理:它們首先接受用戶的請求,根據(jù)用戶請求的URL去真正的目標服務(wù)器取回目標頁面,再根據(jù)不同應(yīng)用的要求做出相應(yīng)處 理后返回給用戶。這樣用戶直接面對的就是這個HTTP應(yīng)用代理,而通過它與其他頁面進行交互。Cookie或Session技術(shù)的應(yīng)用,解決了HTTP協(xié) 議的一個問題 -- 無法保持客戶狀態(tài),因此它現(xiàn)在被廣泛應(yīng)用于各種Web站點中。上面提到的那些應(yīng)用如果不能處理好Cookie和Session的傳遞、更新和廢除等問題, 就會極大的限制它們所能處理站點的范圍,因此如何在HTTP應(yīng)用代理中正確處理Cookie,成為一個必須解決的問題。本文結(jié)合在頁面翻譯 (Machine Translation System)項目中對于Cookie的處理方法,探討一下這方面的解決方案。 MTS項目簡介及討論前提 Machine Translation System(以下簡稱MTS)是一個在線實時頁面翻譯系統(tǒng),為用戶在線提供把英文頁面翻譯成其他9種語言的服務(wù)。用戶通過向MTS系統(tǒng)提交一個類似下面 的URL使用此服務(wù),其中參數(shù)url指明了用戶所需要翻譯的目標地址,參數(shù)language指明了所需翻譯成的目標語言,www.mts.com是假想中 提供MTS服務(wù)的站點。 HTTP://www.mts.com/translate?url=http://www.ibm.com/&language=French 一個完整的MTS系統(tǒng)處理過程可以分解成以下幾個步驟:
當然,這其中涉及到很多的應(yīng)用處理。比如與各種HTTP/HTTPS站點建立聯(lián)結(jié)、根據(jù)HTTP頭信息進行頁面跳轉(zhuǎn)和錯誤處理、為始終保持用戶在翻 譯模式下而對目標的HTML頁面進行分析和修改,根據(jù)系統(tǒng)設(shè)置對某些DNT(Do Not Translate)的頁面進行過濾和跳轉(zhuǎn),當然還有對Cookie的處理等等。其他問題跟這篇文章關(guān)聯(lián)不大,我們重點討論在這種情況下的Cookie處 理。Cookie跟隨目標服務(wù)器的HTTP頭信息被MTS接收到,經(jīng)過MTS整理之后發(fā)給客戶端瀏覽器。MTS在接到下一次用戶對同一個站點的翻譯請求 時,再把從客戶端得到的Cookie發(fā)送給目標服務(wù)器。 在以上的場景中,MTS充當?shù)淖饔妙愃朴谝环NHTTP應(yīng)用代理服務(wù)器,它代替用戶取得目標頁面,并在作出相應(yīng)處理后再提交給用戶。當然,這種代理服 務(wù)器不需要用戶修改瀏覽器的代理服務(wù)器參數(shù)或者網(wǎng)絡(luò)配置,而只是簡單的在瀏覽器的地址欄中輸入一個MTS能夠識別的URL即可。此篇文章也是在這樣一個應(yīng) 用場景的基礎(chǔ)上,展開對HTTP應(yīng)用代理服務(wù)器如何處理Cookie的討論。 ? 問題的產(chǎn)生 在MTS系統(tǒng)中,目標服務(wù)器的Cookie在兩個地方會產(chǎn)生問題。當MTS接收目標服務(wù)器應(yīng)答的時候,Cookie隨著HTTP頭信息被MTS接收 到的。這時候目標服務(wù)器認為MTS就是最終客戶,因此它賦予了Cookie與目標服務(wù)器相符的屬性。而如果MTS把這些Cookie原封不動的保存在 HTTP頭信息中,傳給真正的最終用戶的話,用戶的瀏覽器會因為這些Cookie不合法而忽略它們。同理,當Cookie從瀏覽器端傳回目標服務(wù)器的時 候,也會遇到相同的問題。因此有必要對Cookie進行一些處理,以保證用戶的瀏覽器能真正識別和利用這些Cookie。 但是為何用戶瀏覽器無法識別從目標服務(wù)器傳過來的原始Cookie呢?這是因為出于安全性的考慮,Cookie規(guī)范制定的時候?qū)ookie的產(chǎn)生 和接受設(shè)置了一些嚴格的規(guī)范,不符合這些規(guī)范的Cookie,瀏覽器和服務(wù)器都將予以忽略。下面我們從Cookie規(guī)范入手進行介紹。
Cookie的規(guī)范介紹 目前有以下幾種Cookie規(guī)范:
rfc2965規(guī)范的使用,目前并不多。rfc2109規(guī)范相應(yīng)要嚴格得多,在實際應(yīng)用上,并不是所有的瀏覽器和Web服務(wù)器都嚴格遵守。因此相比 較而言,Netscape cookie草案倒是一個比較簡潔和被廣泛支持的Cookie規(guī)范,因此我們在這里以Netscape cookie草案為基礎(chǔ)進行討論,對于其他兩種規(guī)范,我們的討論和代碼具有相同的意義。關(guān)于Netscape cookie草案的細節(jié),大家可以參照Netscape官方站點,這里我們列舉一些和我們討論有關(guān)的內(nèi)容。 根據(jù)Netscape cookie草案的描述,Cookie 是Web 服務(wù)器向用戶的瀏覽器發(fā)送的一段ASCII碼文本。一旦收到Cookie,瀏覽器會把Cookie的信息片斷以"名/值"對(name-value pairs)的形式儲存保存在本地。這以后,每當向同一個Web 服務(wù)器請求一個新的文檔時,Web 瀏覽器都會發(fā)送之站點以前存儲在本地的Cookie。創(chuàng)建Cookie的最初目的是想讓W(xué)eb服務(wù)器能夠通過多個HTTP請求追蹤客戶。有些復(fù)雜的網(wǎng)絡(luò)應(yīng) 用需要在不同的網(wǎng)頁之間保持一致,它們需要這種會話狀態(tài)的保持能力。 瀏覽器與Web服務(wù)器通過HTTP協(xié)議進行通訊,而Cookie就是保存在HTTP協(xié)議的請求或者應(yīng)答頭部(在HTTP協(xié)議中,數(shù)據(jù)包括兩部分,一 部分是頭部,由一些名值對構(gòu)成,用來描述要被傳輸數(shù)據(jù)的一些信息。一部分是主體(body),是真正的數(shù)據(jù)(如HTML頁面等))進行傳送的。 在HTML文檔被發(fā)送之前,Web服務(wù)器通過傳送HTTP 包頭中的Set-Cookie 消息把一個cookie 發(fā)送到用戶的瀏覽器中。下面是一個遵循Netscape cookie草案的完整的Set-Cookie 頭:
Set-Cookie的每個屬性解釋如下:
一旦瀏覽器接收了cookie,這個cookie和對遠端Web服務(wù)器的連續(xù)請求將一起被瀏覽器發(fā)送。例如 前一個cookie 被存入瀏覽器并且瀏覽器試圖請求 URL http://www.ibm.com/foo/index.html 時,下面的HTTP 包頭就被發(fā)送到遠端的Web服務(wù)器。 GET /foo/index.html HTTP/1.0 一次典型的網(wǎng)絡(luò)瀏覽過程 在了解了Cookie協(xié)議的一些基本內(nèi)容之后,讓我們看看一次典型的網(wǎng)絡(luò)瀏覽過程中瀏覽器如何識別和處理Cookie:
由MTS代理的網(wǎng)絡(luò)瀏覽過程 以上我們了解了在一個典型的瀏覽器與Web服務(wù)器交互的時候,Cookie的傳遞過程。下面我們將看到,如果在MTS代理網(wǎng)絡(luò)瀏覽的過程中,不對Cookie進行修改,上面的Cookie傳遞過程將無法實現(xiàn)。 1. 假設(shè)用戶希望把 http://www.ibm.com/foo/index.html 頁面翻譯成法文,應(yīng)該使用如下的url對MTS發(fā)出請求 :http://www.mts.com/translate?url=http://www.ibm.com/foo/index.html&language=French 2. MTS接收用戶的請求,連接遠程目標服務(wù)器 http://www.ibm.com/foo/index.html。目標服務(wù)器做出應(yīng)答,返回HTTP頭和HTML頁面內(nèi)容。其中,典型的HTTP頭內(nèi)容如下:
3. MTS不對Set-Cookie后的內(nèi)容作任何處理,直接把它加到用戶瀏覽器的應(yīng)答頭上發(fā)送給瀏覽器。 4. 瀏覽器將從Set-Cookie中解析出domain和path的值,分別是.ibm.com和/foo,并與請求的url:http: //www.mts.com/translate?url=http://www.ibm.com/foo/index.html&language =French進行比較。請求url的domain是www.mts.com,path是/,與Set-Cookie中的屬性不符,所以瀏覽器將忽略此 Cookie。 另外,在瀏覽器發(fā)送Cookie的時候也會遇到同樣的問題,同樣如上例,如果瀏覽器里本來已經(jīng)存儲了http: //www.ibm.com/foo/的Cookie,但由于用戶要通過MTS訪問此站點,瀏覽器經(jīng)不會把已經(jīng)存儲的Cookie上轉(zhuǎn)到MTS中,MTS 也就無法把之傳遞到http://ibm.com/foo/上。 基于上面Cookie規(guī)范的介紹和例證,我們能看出,瀏覽器在接受某一個站點的Cookie的時候,需要檢查Cookie的參數(shù)domain、 path、secure,看是否與當前的站點和URL相符,如果不符的話,就會忽略。另一方面。瀏覽器在上傳Cookie的時候,也會根據(jù)當前所訪問站點 的屬性,上傳相關(guān)的Cookie,而其他的Cookie則不予上傳。 至此,我們討論了需要修改Cookie的根本原因在于Cookie規(guī)范的限制。下面我們討論兩種解決問題的思路。 |
總結(jié)
以上是生活随笔為你收集整理的HTTP代理如何正确处理Cookie(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP代理如何正确处理Cookie
- 下一篇: HTTP代理如何正确处理Cookie(2