ASP.NET中Cookie編程入門
LeapSoft
Cookie 為 Web 應(yīng)用程序保存用戶相關(guān)信息提供了一種有用的方法。例如,當(dāng)用戶訪問您的站點(diǎn)時(shí),您可以利用 Cookie 保存用戶首選項(xiàng)或其他信息,這樣,當(dāng)用戶下次再訪問您的站點(diǎn)時(shí),應(yīng)用程序就可以檢索以前保存的信息。
什么是 Cookie?
Cookie 是一小段文本信息,伴隨著用戶請(qǐng)求和頁面在 Web 服務(wù)器和瀏覽器之間傳遞。用戶每次訪問站點(diǎn)時(shí),Web 應(yīng)用程序都可以讀取 Cookie 包含的信息。
Cookie 是與 Web 站點(diǎn)而不是與具體頁面關(guān)聯(lián)的,所以無論用戶請(qǐng)求瀏覽站點(diǎn)中的哪個(gè)頁面,瀏覽器和服務(wù)器都將交換 www.contoso.com 的 Cookie 信息。用戶訪問其他站點(diǎn)時(shí),每個(gè)站點(diǎn)都可能會(huì)向用戶瀏覽器發(fā)送一個(gè) Cookie,而瀏覽器會(huì)將所有這些 Cookie 分別保存。
使用 Cookie 能夠達(dá)到多種目的,所有這些目的都是為了使 Web 站點(diǎn)記住您。例如,一個(gè)實(shí)施民意測(cè)驗(yàn)的站點(diǎn)可以簡(jiǎn)單地利用 Cookie 作為布爾值,表示您的瀏覽器是否已經(jīng)參與了投票,從而避免您重復(fù)投票; 而那些要求用戶登錄的站點(diǎn)則可以通過 Cookie 來確定您是否已經(jīng)登錄過,這樣您就不必每次都輸入憑據(jù)。
Cookie 的限制
大多數(shù)瀏覽器支持最多可達(dá) 4096 字節(jié)的 Cookie,如果要將為數(shù)不多的幾個(gè)值保存到用戶計(jì)算機(jī)上,這一空間已經(jīng)足夠大,但您不能用一個(gè) Cookie 來保存數(shù)據(jù)集或其他大量數(shù)據(jù)。在實(shí)際應(yīng)用中,您可能并不希望在 Cookie 中保存大量的用戶信息,而只希望保存用戶編號(hào)或其他標(biāo)識(shí)符。之后,當(dāng)用戶再次訪問您的站點(diǎn)時(shí),您就可以使用該用戶 ID 在數(shù)據(jù)庫(kù)中查找用戶的詳細(xì)信息。(有關(guān)保存用戶信息的說明,請(qǐng)參閱 Cookie 和安全性。)
瀏覽器還限制了您的站點(diǎn)可以在用戶計(jì)算機(jī)上保存的 Cookie 數(shù)。大多數(shù)瀏覽器只允許每個(gè)站點(diǎn)保存 20 個(gè) Cookie。如果試圖保存更多的 Cookie,則最先保存的 Cookie 就會(huì)被刪除。還有些瀏覽器會(huì)對(duì)來自所有站點(diǎn)的 Cookie 總數(shù)作出限制,這個(gè)限制通常為 300 個(gè)。
您最可能遇到的 Cookie 限制是:用戶可以設(shè)置自己的瀏覽器,拒絕接受 Cookie。您很難解決這個(gè)問題,除非完全不使用 Cookie 而是通過其他機(jī)制來保存用戶相關(guān)信息。保存用戶信息的一種常用方法是會(huì)話狀態(tài),但會(huì)話狀態(tài)又依賴于 Cookie。
編寫 Cookie
您可以利用頁面的 Response(英文)屬性來編寫 Cookie,該屬性提供的對(duì)象使用戶可以將信息添加到由頁面向?yàn)g覽器呈現(xiàn)的信息中。Response 對(duì)象支持一個(gè)名為 Cookies(英文)的集合,您可以向其中添加要寫入瀏覽器的 Cookie。
在創(chuàng)建 Cookie 時(shí),您需要指定幾個(gè)值。最初,您要指定 Cookie 的名稱和其中保存的值。您可以創(chuàng)建多個(gè) Cookie,每個(gè) Cookie 都必須具有唯一的名稱,以便日后讀取時(shí)識(shí)別。(Cookie 是按名稱保存的,所以如果您創(chuàng)建了兩個(gè)名稱相同的 Cookie,后保存的那一個(gè)將覆蓋前一個(gè)。)
一個(gè) Cookie 的有效期應(yīng)為多長(zhǎng)?這取決于 Cookie 的用途,換句話說,取決于您的應(yīng)用程序需要 Cookie 值保持有效的時(shí)間有多長(zhǎng)。如果利用 Cookie 統(tǒng)計(jì)網(wǎng)站的訪問者,您可以把有效期設(shè)置為 1 年,如果某個(gè)用戶已有一年時(shí)間未訪問您的站點(diǎn),則可以把該用戶當(dāng)作新的訪問者; 如果利用 Cookie 來保存用戶的首選項(xiàng),則可以把其設(shè)置為永遠(yuǎn)有效(例如 50 年后到期),因?yàn)槎ㄆ谥匦略O(shè)置首選項(xiàng)對(duì)用戶而言是比較麻煩的。有時(shí),您可能需要編寫在數(shù)秒或數(shù)分鐘內(nèi)即過期的 Cookie。
讀取 Cookie
當(dāng)瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí),該服務(wù)器的 Cookie 會(huì)與請(qǐng)求一起發(fā)送。在 ASP.NET 應(yīng)用程序中,您可以使用 Request 對(duì)象來讀取 Cookie。Request 對(duì)象的結(jié)構(gòu)與 Response 對(duì)象的結(jié)構(gòu)基本相同,所以從 Request 對(duì)象中讀取 Cookie 的方法與向 Response 對(duì)象中寫入 Cookie 的方法非常類似。
在獲取 Cookie 的值之前,應(yīng)該確保該 Cookie 確實(shí)存在。否則,您將得到一個(gè) System.NullReferenceException(英文)異常。還需要注意的是,在頁面中顯示 Cookie 的內(nèi)容之前,我調(diào)用了 HttpServerUtility.HtmlEncode(英文)方法對(duì) Cookie 的內(nèi)容進(jìn)行編碼。之所以這樣做,是因?yàn)槲乙@示 Cookie 的內(nèi)容(一般您不會(huì)這樣做)而且要確保沒有任何惡意用戶在 Cookie 中添加了可執(zhí)行腳本。
刪除 Cookie
刪除 Cookie(即把該 Cookie 從用戶的硬盤上物理刪除)是修改 Cookie 的一種形式。由于 Cookie 位于用戶的計(jì)算機(jī)中,所以您無法直接將其刪除。但是,您可以讓瀏覽器為您刪除 Cookie。修改 Cookie 的方法前面已經(jīng)介紹過(即用相同的名稱創(chuàng)建一個(gè)新的 Cookie),不同的是將其有效期設(shè)置為過去的某個(gè)日期。當(dāng)瀏覽器檢查 Cookie 的有效期時(shí),就會(huì)刪除這個(gè)已過期的 Cookie。
所以,刪除 Cookie 的方法與創(chuàng)建該 Cookie 的方法是相同的,只不過要把其有效期設(shè)置為過去的某個(gè)日期。
Cookie 與安全性
在使用 Cookie 時(shí),您必須意識(shí)到其固有的安全弱點(diǎn)。
對(duì)于初學(xué)者,就應(yīng)用程序而言,Cookie 是用戶輸入的另一種形式,因而很容易被他人非法獲取和利用。由于 Cookie 保存在用戶自己的計(jì)算機(jī)上,所以用戶至少可以看到您保存在 Cookie 中的信息。如果用戶愿意,還能在瀏覽器向您發(fā)送 Cookie 之前修改該 Cookie。
所以,您千萬不要在 Cookie 中保存保密信息 - 用戶名、密碼、信用卡號(hào)等等。在 Cookie 中不要保存不應(yīng)該由用戶掌握的內(nèi)容,也不要保存可能被其他竊取 Cookie 的人控制的內(nèi)容。
Cookie 和會(huì)話狀態(tài)
當(dāng)用戶訪問您的站點(diǎn)時(shí),服務(wù)器會(huì)為該用戶創(chuàng)建唯一的會(huì)話,會(huì)話將一直延續(xù)到用戶訪問結(jié)束。對(duì)于每個(gè)會(huì)話,ASP.NET 都維護(hù)一種基于服務(wù)器的結(jié)構(gòu)(會(huì)話狀態(tài)),在該結(jié)構(gòu)中應(yīng)用程序可以保存用戶的相關(guān)信息。
ASP.NET 需要能跟蹤每個(gè)用戶的會(huì)話 ID,這樣才能把用戶映射到服務(wù)器上的會(huì)話狀態(tài)信息。默認(rèn)情況下,ASP.NET 使用一個(gè)非永久性的 Cookie 來保存會(huì)話狀態(tài)。但是如果用戶禁用了瀏覽器的 Cookie,會(huì)話狀態(tài)就不能使用 Cookie 來保存會(huì)話 ID,會(huì)話狀態(tài)也不會(huì)起作用。
無 Cookie 會(huì)話可以避免瀏覽器拒絕 Cookie 的問題,使您能夠使用會(huì)話狀態(tài)。如果您的應(yīng)用程序依賴于會(huì)話狀態(tài),您可能就需要對(duì)其進(jìn)行配置,使它能使用無 Cookie 會(huì)話。但是,在某些情況下,如果用戶與其他人共享 URL - 可能是用戶通過電子郵件將 URL 發(fā)送給同事,而該用戶的會(huì)話仍然處于激活狀態(tài) - 那么最終這兩個(gè)用戶可能共享同一個(gè)會(huì)話。
關(guān)鍵詞:ASP.NET中Cookie編程入門
相關(guān)文章:
ASP.NET中Cookie編程入門

