Cookie 最早出現(xiàn)是在Netscape Navigator 2.0 中。后來 ASP 也引入了這個技術(shù),它的作用是與 Session 對象相結(jié)合來識別用戶。每當(dāng)用戶開始連接站點(diǎn)時,系統(tǒng)將自動在內(nèi)存塊中創(chuàng)建一個用戶有關(guān)的會話狀態(tài),同時創(chuàng)建一個用戶的 ID 存放在瀏覽器端,與當(dāng)前的用戶惟一地聯(lián)系起來。這樣,服務(wù)器保存了 Session,瀏覽器保存了 Cookie(用戶的 ID)。當(dāng)下一次用戶發(fā)出請求時,請求的用戶將被要求提交用戶的 ID,兩者對照以正確地還原原來的會話狀態(tài)。這就是在無狀態(tài)協(xié)議的 HTTP 條件下保持用戶標(biāo)志的方法。
可以通過 Response.Cookies.Add() 方法直接向?yàn)g覽器寫入 Cookie,通過 Request.Cookies 方法讀取已經(jīng)設(shè)置好的 Cookie。
寫入Cookie 的方法是,先創(chuàng)建一個HttpCookie 對象,通過這個對象來構(gòu)造一個 Cookie。例如:
//創(chuàng)建一個 HttpCookie 對象 HttpCookie cookie = new HttpCookie("樂豬網(wǎng)"); //設(shè)定此 Cookie 值 cookie.Value = "編程入門網(wǎng)站"; //加入此 Cookie Response.Cookies.Add(cookie);
Cookie 有臨時的,也有永遠(yuǎn)的。永久的 Cookie 以文件形式存儲在計算機(jī)上,關(guān)閉 Internet Explorer 時仍然保留在計算機(jī)上。再次訪問該站點(diǎn)時,創(chuàng)建該 Cookie 的網(wǎng)站可以讀取。在具體的編程時候,是在寫入此 Cookie 的時候,設(shè)定 Cookie 的生命周期,其代碼如下:
DateTime dtNow = DateTime.Now; TimeSpan tsMinute = new TimeSpan(0, 1, 0, 0); cookie.Expires = dtNow + tsMinute; Response.Cookies.Add(cookie);
以上代碼是設(shè)定新產(chǎn)生的 Cookie 的生命期為一個小時,可以通過修改 TimeSpan 的屬性來設(shè)定 Cookie 具體的生命期。如果不設(shè)定時間,默認(rèn)時間為 20 分鐘。
讀取指定的 Cookie 時的語句如下:
HttpCookie cookie = Request.Cookies["Cookie 的名稱"];
如果想將讀出的 Cookie 顯示出來時,可以使用以下語句:
Response.Write(cookie.Value.ToString());
Cookie 是保存在客戶端的字符串,它會影響用戶的行為,但又不受用戶的直接管理,雖然它只是一種標(biāo)志(字母數(shù)字字符串)而不是程序,不可能用它來收集用戶的信息,破壞用戶的隱私。但有的用戶仍然不放心,也可能是不愿意別人占用自己的空間,相當(dāng)一部分用戶在瀏覽器中禁止使用 Cookie。這就給識別用戶帶來了困難。
ASP.NET 2.0 現(xiàn)在已經(jīng)完全解決了在不使用 Cookie 的情況下,識別用戶的方法(ASP.NET 1.1 版本只部分地解決了這一問題)。解決的方法很簡單,只需要在應(yīng)用程序的根目錄下的 Web.config 文件中,對 <sessionState> 節(jié)點(diǎn)進(jìn)行配置,其他任何程序都不需要修改。為什么一定要在應(yīng)用程序的根目錄下配置?因?yàn)闀挔顟B(tài)的設(shè)置是應(yīng)用程序范圍的設(shè)置。站點(diǎn)中的網(wǎng)頁要么全都使用該配置,要么全都不使用。配置的語句是:
<sessionState cookieless="useUri" />
或
<sessionState cookieless="AutoDetect" />
配置時,當(dāng)編寫到“cookieless=”語句時,將彈出 AutoDetect、useCookies、useDeviceProfile、useUri 四種選擇。選擇 AutoDetect 或 useUri 均可在無 Cookies 的條件下識別用戶。
雖然在 <sessionState> 節(jié)點(diǎn)中還可以配置會話狀態(tài)管理的其他方面,包括存儲介質(zhì)和連接字符串等,但是,就 Cookie 而言,只需設(shè)置 Cookieless 屬性即可。
系統(tǒng)是如何在無 Cookie 的條件下識別用戶的呢?原來當(dāng)進(jìn)行了前面的設(shè)置以后,系統(tǒng)將會要求用戶自動將客戶端的資源信息嵌入到用戶設(shè)用的 URL 語句中。例如,在使用 Cookie 的情況下,某用戶設(shè)用網(wǎng)頁時的 URL 是:http://yourserver/folder/default.aspx,現(xiàn)在設(shè)置了不使用 Cookie 的配置,調(diào)用的語句的 URL 將變成:http://yourserver/folder/(session ID here)/default.aspx,其中“session ID here”代表用戶的資源信息所處的位置。該信息已經(jīng)被插入到 URL 的語句中。由于用戶資源信息對于用戶來說具有惟一性,因此可以利用它與 Session 對象結(jié)合,一起來識別用戶。
下面舉一個完整的小例子吧,請看下面的源代碼:
HttpCookie ck = Request.Cookies["cktest"]; if (ck == null) { ck = new HttpCookie("cktest"); ck.Value = "123"; ck.Expires = DateTime.Now.AddSeconds(20);//20秒的有效期 Response.Cookies.Add(ck); Response.Write("new ck"); } else { Response.Write(ck.Value.ToString()); } //在一個Cookie中儲存多個信息 HttpCookie cookie = new HttpCookie("cktest"); cookie.Values.Add("v1", "1"); cookie.Values.Add("v2", "2"); cookie.Values.Add("v3", "3"); Response.AppendCookie(cookie); HttpCookie cookies = Request.Cookies["cktest"]; string value1 = cookies.Values["v1"]; string value2 = cookies.Values["v2"]; Response.Write(value1 + value2);
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com