ASP.NET實現Cookie功能的三個基本操作(寫入,讀取,刪除)


依照我的習慣,依照前幾天在園子里看到的那篇文章“二逼程序員 VS 苦逼程序員”,准確點來說,我就是個苦逼的程序員。

1. 二逼程序員(Day Programmers)

2. 苦逼程序員(Night Programmers)

因為我是個Night Programmer。總是在晚上完成各種編碼工作。(這篇文章也是晚上三點開始寫的,今天中午寫完。)

二逼程序員 VS 苦逼程序員

 

說正事


 

簡而言之,在Cookie的時候有三個過程,分別是“寫入,讀取,刪除”。任何偉大之作都是有基本的東西構成的,而Cookie的運用也不例外。

 

寫入:


 

 

 1   //創建一個HttpCookie對象
2 HttpCookie cookie = new HttpCookie("RON");
3 //設定此cookies值
4 cookie.Value = "我叫小魏";
5 //設定cookie的生命周期,在這里定義為三分鍾
6 DateTime dtNow = DateTime.Now;
7 TimeSpan tsMinute = new TimeSpan(0, 0, 3, 0);
8 cookie.Expires = dtNow + tsMinute;
9 cookie["Name"] = "小魏";
10 cookie["Sex"] = "";
11 cookie["Age"] = "22";
12 //加入此cookie
13 Response.Cookies.Add(cookie);
14 Response.Write("Cookie創建完畢");

HttpCookie 在 System.Web 這個命名空間里面,所以你需要引用

1 using System.Web;

 

*創建Cookie

創建Cookie的時候必須指定Cookie的Name和Value。在例子中,cookie 的Name是“RON”,Value是“我叫小魏”!cookie是保存在瀏覽器當中的,而每個Cookie的區別是根據Name這個屬性的值來確定的。所以,如果Name相同,Cookie的內容將被覆蓋。而那些cookie["Name"]等等是cookie["RON"]的子鍵。

 

*Cookie有效期

Cookie的另外一個重要的屬性是有效期。通過屬性Expires設置。例子中,cookie設置的有效期為三分鍾。目前為止,最長的有效期是50年,這是那個丫地設定的啊。有50年的公司都不錯了。其實在有效期的設置上我更喜歡這句話。

cookie.Expires = DateTime.Now.AddMinutes(3);

簡單,容易理解。

在有效期的問題上,有兩個時間比較特殊:

#永久性 Cookie 設置永遠不過期 最長為50年

#非永久性 Cookie 不設置有效期 關閉瀏覽器即消失

 

*多值cookie

Cookie可以保存多個值,你只要創建一個帶子鍵的Cookie就可以了。例如

1 HttpCookie aCookie = new HttpCookie("userInfo");
2 aCookie.Values["userName"] = "rond";
3 aCookie.Values["lastVisit"] = DateTime.Now.ToString();
4 aCookie.Expires = DateTime.Now.AddDays(1);

例子中創建了一個Name為userInfo的Cookie,而且此Cookie還帶有兩個子鍵。

 

*Cookie的范圍

默認情況下,Cookie的整個站點都是有效的。意思就是說,在同一個站點(也可以理解成同一個域名)下的所有網頁都是可以獲取到Cookie的。如果你不希望你的Cookie在所有范圍都有效。你可以限定Cookie的范圍。方法是通過Cookie的Path屬性,屬性值為范圍所在的路徑,相對路徑有效。譬如

1 appCookie.Path = "/Application1";

 除了限定Cookie的路徑范圍,還可以用Cookie的Domain屬性限定Cookie的域名范圍。例如

1 appCookie.Domain = "jsjx.gdufs.edu.cn";

例子中將cookie限定在“廣東外語外貿大學”的“信息學院”(jsjx.gdufs.edu.cn)網站下,而不會再“廣東外語外貿大學”(gdufs.edu.cn)的主網站上面產生效果。

*提交Cookie

Cookie是保存在瀏覽器的東西,所以需要提交才能將信息保存在瀏覽器當中。

1 Response.Cookies.Add(aCookie);

這樣就可以將數據保存在瀏覽器當中了。

 

PS:Cookie的創建還有另外一種方式,可以參考MSDN的說明。

 

讀取:


 

先來個例子

          //獲得cookie
    HttpCookie cookie = Request.Cookies["RON"];
//確定是否存在用戶輸入的cookie
if (null == cookie)
{
Response.Write("沒有發現指定的cookie!");
}
else
{
//找到指定的cookie,顯示cookie的值
String strCookieValue = cookie.Value.ToString();
Response.Write( " cookie 的值為: " + strCookieValue + " <br >");
Response.Write(cookie["UserName"]);
}


*獲取

通過Request響應,我們可以獲取到Request.Cookies["RON"].根據原本的設定可以將Cookie的值讀取出來。cookie.Value可以獲取到Cookie保存的所有值。不過個人比較喜歡cookie["UserName"]的方式獲取自己想要的cookie的值。

如果你是通過多值設置了Cookie的子鍵。那么獲取方式和設定方式是差不多的。


*讀取多個Cookie

在一個瀏覽器上面,可能保存了不止一個cookie。但是怎么獲取所有的cookie呢。寫個循環就出來了。

        for (int i = 0; i < Request.Cookies.Count; i++)
{
Response.Write("Cookie[" + i + "]的Name為:" + Request.Cookies[i].Name + "<br/>");
Response.Write("Cookie[" + i + "]的Value為:" + Request.Cookies[i].Value + "<br/>");
}

如果你不想把子鍵的鍵/值都顯現在一起,而想單個獲取。也可以寫個循環全部顯示出來。

        //顯示子鍵
for (int i = 0; i < Request.Cookies.Count; i++)
{
Response.Write("Cookie[" + i + "]的Name為:" + Request.Cookies[i].Name + "<br/>");
if (Request.Cookies[i].HasKeys)
{
for (int j = 0; j < Request.Cookies[i].Values.Count; j++)
{
Response.Write("Cookie[" + i + "][" + j + "]的Name為:" + Request.Cookies[i].Values.AllKeys[j] + "<br/>");
Response.Write("Cookie[" + i + "][" + j + "]的Value為:" + Request.Cookies[i].Values[j] + "<br/>");
}
}
}

 

刪除:


 

Cookie保存在瀏覽器端,保存時間是開發者設定的時間,當時間過期時,瀏覽器端就會刪除Cookie。所以刪除Cookie的工作就是將Cookie的有效期設置過期即可。你可以設置有效期為當前時間,Cookie立即過期。也可以設置過去的時間,Cookie也會被刪除。

如例子,我當初創建了一個叫做RON的Cookie,現在我要刪除它。所以要新建一個同名的Cookie,時間設置為過去。

*刪除某一個Cookie

 HttpCookie aCookie= new HttpCookie("RON");
aCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(aCookie);

這樣就可以將Cookie["RON"]刪除。

可能你不記得你在測試的時候瀏覽器端到底保存了多少個Cookie,你可以寫個循環將Cookie全部刪除掉。

*刪除所有Cookie

        //刪除全部Cookie
for (int i = 0; i < Request.Cookies.Count; i++)
{
string cookiesName = Request.Cookies[i].Name;
HttpCookie cookie = new HttpCookie(cookiesName);
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);

}


*修改

其實修改和刪除一樣的,都是新建一個同名Cookie,只不過刪除設置的時間是過去的或者當前,修改就可以設置時間為新的一個有效期,內容也可以重新定義,這樣就會覆蓋瀏覽器端的內容。就不打代碼了。

測試用例

Test.aspx

View Code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
Cookie名稱:<asp:TextBox ID="NameField" runat="server" />
<br>
Cookie的值:<asp:TextBox ID="ValueField" runat="server" />
<br>
<asp:Button ID="Button1" Text="創建Cookie" OnClick="WriteClicked" runat="server" />
<br>
<asp:button ID="Button2" text = "讀取cookie" onclick = "ReadClicked" runat = "server" />
<br />
<asp:Button ID="Button3" runat="server" onclick="Button3_Click" Text="測試" />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</form>
</body>
</html>

Test.aspx.cs

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void WriteClicked(object sender, EventArgs e)
{
//創建一個HttpCookie對象
HttpCookie cookie = new HttpCookie("jsjx");
//設定此cookies值
cookie.Value = "GDUFS的值";
//設定cookie的生命周期,在這里定義為一個小時
DateTime dtNow = DateTime.Now;
TimeSpan tsMinute = new TimeSpan(0, 0, 3, 0);
cookie.Expires = dtNow + tsMinute;
cookie["姓名"] = "王天";
cookie["性別"] = "";
cookie["年齡"] = "26";
//加入此cookie
Response.Cookies.Add(cookie);
Response.Write(NameField.Text + "Cookie創建完畢 <br > <hr > ");
}
protected void ReadClicked(Object Sender, EventArgs e)
{
//得到用戶輸入的cookie名稱
String strCookieName = "11";
//獲得cookie
HttpCookie cookie = Request.Cookies[strCookieName];
//確定是否存在用戶輸入的cookie
if (null == cookie)
{
Response.Write("沒有發現指定的cookie <br > <hr > ");
}
else
{
//找到指定的cookie,顯示cookie的值
String strCookieValue = cookie.Value.ToString();
Response.Write(strCookieName + " cookie 的值為: <b > "
+ strCookieValue + " </b > <br > <hr > ");
Response.Write(cookie["姓名"]);
}
}
protected void Button3_Click(object sender, EventArgs e)
{
System.Text.StringBuilder output = new System.Text.StringBuilder();
HttpCookie aCookie;

//循環輸出Cookie的內容(1)
//for (int i = 0; i < Request.Cookies.Count; i++)
//{
// aCookie = Request.Cookies[i];
// output.Append("Cookie name = " + Server.HtmlEncode(aCookie.Name)
// + "<br />");
// output.Append("Cookie value = " + Server.HtmlEncode(aCookie.Value)
// + "<br /><br />");
//}
//Label1.Text = output.ToString();


//循環輸出Cookie的內容(2)
//for (int i = 0; i < Request.Cookies.Count; i++)
//{
// Response.Write("Cookie[" + i + "]的Name為:" + Request.Cookies[i].Name + "<br/>");
// Response.Write("Cookie[" + i + "]的Value為:" + Request.Cookies[i].Value + "<br/>");
//}

//顯示子鍵(1)
//for (int i = 0; i < Request.Cookies.Count; i++)
//{
// aCookie = Request.Cookies[i];
// output.Append("Name = " + aCookie.Name + "<br />");
// if (aCookie.HasKeys)
// {
// for (int j = 0; j < aCookie.Values.Count; j++)
// {
// string subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);
// string subkeyValue = Server.HtmlEncode(aCookie.Values[j]);
// output.Append("Subkey name = " + subkeyName + "<br />");
// output.Append("Subkey value = " + subkeyValue +
// "<br /><br />");
// }
// }
// else
// {
// output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
// "<br /><br />");
// }
//}
//Label1.Text = output.ToString();


////顯示子鍵(2)
//for (int i = 0; i < Request.Cookies.Count; i++)
//{
// Response.Write("Cookie[" + i + "]的Name為:" + Request.Cookies[i].Name + "<br/>");
// if (Request.Cookies[i].HasKeys)
// {
// for (int j = 0; j < Request.Cookies[i].Values.Count; j++)
// {
// Response.Write("Cookie[" + i + "][" + j + "]的Name為:" + Request.Cookies[i].Values.AllKeys[j] + "<br/>");
// Response.Write("Cookie[" + i + "][" + j + "]的Value為:" + Request.Cookies[i].Values[j] + "<br/>");
// }
// }
//}

//for (int i = 0; i < Request.Cookies.Count; i++)
//{
// aCookie = Request.Cookies[i];
// output.Append("Name = " + aCookie.Name + "<br />");
// if (aCookie.HasKeys)
// {
// for (int j = 0; j < aCookie.Values.Count; j++)
// {
// subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);
// subkeyValue = Server.HtmlEncode(aCookie.Values[j]);
// output.Append("Subkey name = " + subkeyName + "<br />");
// output.Append("Subkey value = " + subkeyValue +
// "<br /><br />");
// }
// }
// else
// {
// output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
// "<br /><br />");
// }
//}
//Label1.Text = output.ToString();

//刪除全部Cookie
string cookieName;
int limit = Request.Cookies.Count;
for (int i = 0; i < limit; i++)
{
cookieName = Request.Cookies[i].Name;
aCookie = new HttpCookie(cookieName);
aCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(aCookie);
}

//刪除全部Cookie
for (int i = 0; i < Request.Cookies.Count; i++)
{
string cookiesName = Request.Cookies[i].Name;
HttpCookie cookie = new HttpCookie(cookiesName);
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);

}
}
}



只要知道Cookie的“寫入,讀取,刪除”,你可以運用Cookie做許多你意想不到的事情。譬如前幾天看到一篇博客,將新浪微博臨時保存為發送的信息用Cookie實現出來了。我做了不少網站,這是第一次真的將Cookie的功能做進一個產品里面。根據用戶體驗來說,我覺得這個功能還是挺有用的。寫這篇博客的的原因主要是當做讀書筆記。這次為了實現這個功能查看了不少MSDN的內容。記下這些是希望,自己下次使用這些功能的的時候容易查找。

 


 

參考資料:

MSDN:http://msdn.microsoft.com/zh-cn/library/ms178194(v=VS.80).aspx





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM