Cookie 為 Web 應(yīng)用程序保存用戶相關(guān)信息提供了一種有用的方法。例如,當(dāng)用戶訪問站點(diǎn)時,可以利用 Cookie 保存用戶首選項(xiàng)或其他信息,這樣,當(dāng)用戶下次再訪問站點(diǎn)時,應(yīng)用程序就可以檢索以前保存的信息。
從技術(shù)上講,Cookie是小段保存在客戶端的數(shù)據(jù)(如果你安裝的是XP,可以看一下安裝Windows的盤>:\Documents and Settings\用戶名>\Cookies文件夾)。用戶訪問網(wǎng)站的時候,網(wǎng)站會給用戶一個包含過期時間的Cookie,瀏覽器收到Cookie后就存放在客戶端的文件夾下。以后用戶每次訪問網(wǎng)站頁面的時候,瀏覽器會根據(jù)網(wǎng)站的URL在本地Cookie文件夾內(nèi)查找是否存在當(dāng)前網(wǎng)站關(guān)聯(lián)的Cookie,如果有的話就連同頁面請求一起發(fā)送到服務(wù)器。
一、關(guān)于Cookie的知識還需要了解以下幾點(diǎn)。
·Cookie只是一段字符串,并不能執(zhí)行。
·大多數(shù)瀏覽器規(guī)定Cookie大小不超過4K,每個站點(diǎn)能保存的Cookie不超過20個,所有站點(diǎn)保存的Cookie總和不超過300個。
·除了Cookie外,幾乎沒有其他的方法在客戶端的機(jī)器上寫入數(shù)據(jù)(就連Cookie的寫入操作也是瀏覽器進(jìn)行的)。當(dāng)然,連Cookie都可以通過瀏覽器安全配置來禁止。如果你使用IE瀏覽器,可以看一下“工具”→“Internet”選項(xiàng)→“隱私”一頁?,F(xiàn)在的大多數(shù)網(wǎng)站都利用Cookie來保存一些數(shù)據(jù)(比如你的ID),以便你下一次訪問網(wǎng)站時能直接“繼續(xù)”以前的配置,所以我還是建議你不要輕易關(guān)閉Cookie。
在使用Cookie時,必須意識到其固有的安全弱點(diǎn)。Cookie畢竟是存放于客戶端的。因此,不要在Cookie中保存保密信息,如用戶名、密碼、信用卡號等。在Cookie中不要保存不應(yīng)該由用戶掌握的內(nèi)容,也不要保存可能被其他竊取Cookie的人控制的內(nèi)容。
二、Cookie的使用
下面,我們就來討論如何保存、讀取、刪除和修改Cookie。首先在頁面上添加4個按鈕用來完成這4個操作。
復(fù)制代碼 代碼如下:
asp:Button ID="btn_SaveCookie" runat="server" OnClick="btn_SaveCookie_Click" Text="保存Cookie" />
asp:Button ID="btn_ReadCookie" runat="server" Text="讀取Cookie" OnClick="btn_ReadCookie_Click" />
asp:Button ID="btn_ModifyCookie" runat="server" OnClick="btn_ModifyCookie_Click" Text="修改Cookie" />
asp:Button ID="btn_DelCookie" runat="server" Text="刪除Cookie" OnClick="btn_DelCookie_Click" />
保存Cookie的方法如下。
復(fù)制代碼 代碼如下:
protected void btn_SaveCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = new HttpCookie("test1", "單值Cookie");
SingleValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(SingleValueCookie);
HttpCookie MultiValueCookie = new HttpCookie("test2");
MultiValueCookie.Values.Add("key1", "value1");
MultiValueCookie.Values.Add("key2", "value2");
MultiValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(MultiValueCookie);
}
我們可以看到,一個Cookie中允許保存單個值也可以保存多個值。HttpCookie類型表示一個Cookie,Expires屬性用于修改Cookie的過期時間。對于單值Cookie,既可以直接在構(gòu)造方法中指定值也可以使用Value屬性指定值。對于多值Cookie,既可以使用Values屬性的Add方法添加子鍵和值,也可以直接使用Values屬性的索引設(shè)置子鍵和值。上面這段代碼等價于下面這段代碼。
復(fù)制代碼 代碼如下:
protected void btn_SaveCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = new HttpCookie("test1");
SingleValueCookie.Value = "單值Cookie";
SingleValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(SingleValueCookie);
HttpCookie MultiValueCookie = new HttpCookie("test2");
MultiValueCookie.Values["key1"] = "value1";
MultiValueCookie.Values["key2"] = "value2";
MultiValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(MultiValueCookie);
}
在添加完值以后,務(wù)必記得使用Response對象把Cookie重新返回給瀏覽器。我們的服務(wù)器不能直接在客戶端機(jī)器上寫Cookie,而是由瀏覽器完成這一工作,當(dāng)然用戶也可以設(shè)置是否允許瀏覽器讀寫Cookie。
下面是讀取Cookie的操作。
復(fù)制代碼 代碼如下:
protected void btn_ReadCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = Request.Cookies["test1"];
if (SingleValueCookie != null)
{
Response.Write(string.Format("Key:{0} Value:{1} Expires:{2}br/>", "test1", SingleValueCookie.Value, SingleValueCookie.Expires));
}
HttpCookie MultiValueCookie = Request.Cookies["test2"];
if (MultiValueCookie!= null)
{
Response.Write(string.Format("Key:{0} Value:{1}br/>", "test2", MultiValueCookie.Value));
foreach (string subkey in MultiValueCookie.Values.AllKeys)
{
Response.Write(string.Format("SubKey:{0} Value:{1} Expires:{2}br/>", subkey, MultiValueCookie.Values[subkey], MultiValueCookie.Expires));
}
}
}
對于多值Cookie,我們通過遍歷AllKeys屬性返回的字符串?dāng)?shù)組獲取所有子鍵Key,從而獲得子鍵的值。要注意的是,在訪問Cookie以前,需要檢測一下Cookie是否存在。打開頁面,先單擊“保存Cookie”按鈕,然后單擊“讀取Cookie”按鈕,得到以下輸出:
Key:test1 Value:單值Cookie Expires:0001-1-1 0:00:00
Key:test2 Value:key1=value1key2=value2
SubKey:key1 Value:value1 Expires:0001-1-1 0:00:00
SubKey:key2 Value:value2 Expires:0001-1-1 0:00:00
這里要說明以下幾點(diǎn)。
·我們發(fā)現(xiàn),所有Cookie的過期時間都不能正常顯示。這是因?yàn)闉g覽器返回給服務(wù)器的Cookie是不包含過期時間的,而服務(wù)器返回給瀏覽器的Cookie是包含過期時間的。過期時間只對客戶端瀏覽器有意義,對服務(wù)器來說沒有什么意義。
·直接讀取多值Cookie的Value,它會把所有子鍵和子鍵值都使用key=value方法顯示,多個子鍵使用“”連接(類似URL的方式)。
下面是刪除Cookie的操作。
復(fù)制代碼 代碼如下:
protected void btn_DelCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = Request.Cookies["test1"];
SingleValueCookie.Expires = DateTime.MinValue;
Response.Cookies.Add(SingleValueCookie);
}
如果你想刪除所有Cookie,可以遍歷刪除。
復(fù)制代碼 代碼如下:
protected void btn_DelCookie_Click(object sender, EventArgs e)
{
foreach (string key in Request.Cookies.AllKeys)
{
HttpCookie cookie = Request.Cookies[key];
cookie.Expires = DateTime.MinValue;
Response.Cookies.Add(cookie);
}
}
我們始終要記住,服務(wù)器不能直接刪除Cookie,刪除Cookie的操作是瀏覽器進(jìn)行的。說是刪除,其實(shí)是把它的過期時間設(shè)置為過去的時間,讓Cookie過期。因此,對于刪除操作來說有三個步驟。
1.從Request對象中獲取Cookie。
2.把Cookie的過期時間設(shè)置為過去的時間。
3.把Cookie重新寫回Response中。
4.修改Cookie的操作也非常簡單。
復(fù)制代碼 代碼如下:
protected void btn_ModifyCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = Request.Cookies["test1"];
SingleValueCookie.Value = "修改后的單值Cookie";
Response.Cookies.Add(SingleValueCookie);
}
三、Cookie使用擴(kuò)展
(1)編寫Cookie
復(fù)制代碼 代碼如下:
//方式1:
Response.Cookies["username"].value="mike";
Response.Cookies["username"].Expires=DateTime.MaxValue;
//方式2:
HttpCookie acookie = new HttpCookie("last");
acookie.Value="a";
acookie..Expires=DateTime.MaxValue;
Response.Cookies.Add(acookie);
//多值Cookie的寫法
復(fù)制代碼 代碼如下:
//方式1:
Response.Cookies["userinfo1"]["name"].value="mike";
Response.Cookies["userinfo1"]["last"].value="a";
Response.Cookies["userinfo1"].Expires=DateTime.MaxValue;
//方式2:
HttpCookie cookie = new HttpCookie("userinfo1");
cookie.Values["name"]="mike";
cookie.Values["last"]="a";
cookie.Expires=DateTime.MaxValue;
//cookie.Expires = System.DateTime.Now.AddDays(1);//設(shè)置過期時間 1天
Response.Cookies.Add(cookie);
(2)讀取Cookie
Internet Explorer 將站點(diǎn)的 Cookie 保存在文件名格式為 user>@domain>.txt 的文件中,其中 user> 是您的帳戶名。
注意:在獲取Cookie的值之前,應(yīng)該確保該 Cookie 確實(shí)存在。否則,您將得到一個異常
復(fù)制代碼 代碼如下:
If (Request.Cookies["userName"]!=null)
{
string str = Request.Cookies("userName").Value;
}
//多值Cookie的讀取
If ( Request.Cookies["userInfo1"]!=null )
{
string name=Request.Cookies["userInfo1"]["name"];
string last=Request.Cookies["userInfo1"]["last"];
}
//讀取 Cookie 集合
for(int i = 0 ;iRequest.Cookies.Count ;i++)
{
HttpCookie cookies = Request.Cookies;
Response.Write("name="+cookies.Mame+"br/>");
if (cookies.HasKeys )//是否有子鍵
{
System.Collections.Specialized.NameValueCollection NameColl
= aCookie.Values ;
for(int j=0;jNameColl.Count;j++)
{
Response.Write("子鍵名="+ NameColl.AllKey[j] +"br/>");
Response.Write("子鍵值="+ NameColl[j] +"br/>");
}
}
else
{
Response.Write("value="+cookies.Value+"br/>");
}
}
運(yùn)行此代碼時,可看到一個名為“ASP.NET_SessionId”的Cookie,ASP.NET用這個 Cookie 來保存您的會話的唯一標(biāo)識符。
(3)刪除 Cookie
將其有效期設(shè)置為過去的某個日期。當(dāng)瀏覽器檢查 Cookie 的有效期時,就會刪除這個已過期的 Cookie。
復(fù)制代碼 代碼如下:
HttpCookie cookie = new HttpCookie("userinfo1");
cookie.Expires=DateTime.Now.AddDays(-30);
Response.Cookies.Add(cookie);
(4)修改cookie
復(fù)制代碼 代碼如下:
Response.Cookies["Info"]["user"] = "2";
Response.Cookies["Info"].Expires = DateTime.Now.AddDays(1); 刪除cookie下的屬性
HttpCookie acookie=Request.Cookies["Info"];
acookie.Values.Remove("userid");
acookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(acookie); 刪除所有cookie,就是設(shè)置過期時間為現(xiàn)在就行了
int limit=Request.Cookies.Count - 1;
for(int i=0;ilimit;i++)
{
acookie = Request.Cookies(i)
acookie.Expires = DateTime.Now.AddDays(-1)
Response.Cookies.Add(acookie)
}
-------------
如果有主站及二級域名站且cookie要共享的話則要加入如下設(shè)置
復(fù)制代碼 代碼如下:
cookie.Domain = ".主域名";
cookie.Path = "/";
四、Cookie總結(jié)
Cookie雖然是一個簡單實(shí)用的對象,但是我們也要注意Cookie的工作原理、大小限制以及安全性等,大致可以歸納為以下幾點(diǎn)。
·存儲的物理位置??蛻舳说腃ookies文件夾內(nèi)。
·存儲的類型限制。字符串。
·狀態(tài)使用的范圍。當(dāng)前請求上下文的上下文都能訪問到Cookie,Cookie對每個用戶來說都是獨(dú)立的。
·存儲的大小限制。每個Cookie不超過4K數(shù)據(jù)。每個網(wǎng)站不超過20個Cookie。所有網(wǎng)站的Cookie總和不超過300個。
·生命周期。每個Cookie都有自己的過期時間,超過了過期時間后失效。
·安全與性能。存儲在客戶端,安全性差。對于敏感數(shù)據(jù)建議加密后存儲。
·優(yōu)點(diǎn)缺點(diǎn)與注意事項(xiàng)??梢院芊奖愕仃P(guān)聯(lián)網(wǎng)站和用戶,長久保存用戶設(shè)置。
您可能感興趣的文章:- 詳解在ASP.NET Core 中使用Cookie中間件
- Asp.net中安全退出時清空Session或Cookie的實(shí)例代碼
- asp.net利用cookie保存用戶密碼實(shí)現(xiàn)自動登錄的方法
- ASP.NET之Response.Cookies.Remove 無法刪除COOKIE的原因
- ASP.NET筆記之頁面跳轉(zhuǎn)、調(diào)試、form表單、viewstate、cookie的使用說明
- ASP.NET Cookie是怎么生成的(推薦)