.net Cookie的用法

.net Cookie的用法

摘自:http://apps.hi.baidu.com/share/detail/30870201

0.相關概念及知識

Cookie 提供了一種在 Web 應用程序中存儲用戶特定信息的方法。
例如,當用戶訪問您的站點時,
您可以使用 Cookie 存儲用戶首選項或其他信息。
當該用戶再次訪問您的網站時,應用程序便可以檢索以前存儲的信息。


什麼是 Cookie?

Cookie 是一小段文本信息,
伴隨着用戶請求和頁面在 Web 服務器和瀏覽器之間傳遞。
Cookie 包含每次用戶訪問站點時 Web 應用程序都可以讀取的信息。

例如,
如果在用戶請求站點中的頁面時應用程序發送給該用戶的不僅僅是一個頁面,
還有一個包含日期和時間的 Cookie,
用戶的瀏覽器在獲得頁面的同時還獲得了該 Cookie,
並將它存儲在用戶硬盤上的某個文件夾中。

以後,如果該用戶再次請求您站點中的頁面,
當該用戶輸入 URL 時,瀏覽器便會在本地硬盤上查找與該 URL 關聯的 Cookie。
如果該 Cookie 存在,瀏覽器便將該 Cookie 與頁請求一起發送到您的站點。
然後,應用程序便可以確定該用戶上次訪問站點的日期和時間。
您可以使用這些信息向用戶顯示一條消息,也可以檢查到期日期。

Cookie 與網站關聯,而不是與特定的頁面關聯。
因此,無論用戶請求站點中的哪一個頁面,瀏覽器和服務器都將交換 Cookie 信息。
用戶訪問不同站點時,各個站點都可能會向用戶的瀏覽器發送一個 Cookie;
瀏覽器會分別存儲所有 Cookie。

使用 Cookie 能夠達到多種目的,所有這些目的都是爲了幫助網站記住用戶。
例如,一個實施民意測驗的站點可以簡單地將 Cookie 作爲一個 Boolean 值,
用它來指示用戶的瀏覽器是否已參與了投票,這樣用戶便無法進行第二次投票。
要求用戶登錄的站點則可以通過 Cookie 來記錄用戶已經登錄,
這樣用戶就不必每次都輸入憑據。


Cookie 的限制

大多數瀏覽器支持最大爲 4096 字節的 Cookie。
由於這限制了 Cookie 的大小,最好用 Cookie 來存儲少量數據,
或者存儲用戶 ID 之類的標識符。
用戶 ID 隨後便可用於標識用戶,以及從數據庫或其他數據源中讀取用戶信息。

瀏覽器還限制站點可以在用戶計算機上存儲的 Cookie 的數量。
大多數瀏覽器只允許每個站點存儲 20 個 Cookie;
如果試圖存儲更多 Cookie,則最舊的 Cookie 便會被丟棄。
有些瀏覽器還會對它們將接受的來自所有站點的 Cookie 總數作出絕對限制,
通常爲 300 個。

雖然 Cookie 在應用程序中非常有用,但應用程序不應依賴於能夠存儲 Cookie。
不要使用 Cookie 支持關鍵功能。如果應用程序必須依賴於 Cookie,
則可以通過測試確定瀏覽器是否將接受 Cookie。


1.編寫和保存Cookie

複製 保存
//保存用戶名和密碼
protected void Button1_Click(object sender, EventArgs e)
{
    //因爲涉及到密碼等的保存 最好是用MD5等加密後 再保存
    Response.Cookies["userInfo"]["userName"] = this.txt_UserName.Text.Trim();
    if (this.chk_SavePWD.Checked)
        Response.Cookies["userInfo"]["userPassword"] = this.txt_UserPassword.Text.Trim();
    Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
    //或
    //HttpCookie aCookie = new HttpCookie("userInfo");
    //aCookie.Values["userName"] = this.txt_UserName.Text.Trim();
    //if (this.chk_SavePWD.Checked)
    //    aCookie.Values["userPassword"] = this.txt_UserPassword.Text.Trim();
    //aCookie.Expires = DateTime.Now.AddDays(-1);//立即失效
    //Response.Cookies.Add(aCookie);
}


2.列舉Cookie
複製 保存
//列出相關Cookie
protected void Button2_Click(object sender, EventArgs e)
{
    System.Text.StringBuilder output = new System.Text.StringBuilder();
    HttpCookie aCookie;
    string subkeyName;
    string subkeyValue;

    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 />");
        }
    }
    this.Label1.Text = output.ToString();
}


3.讀取Cookie
複製 保存
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //讀取相關保存值
        if (Request.Cookies["userInfo"] != null)
        {
            this.txt_UserName.Text = Request.Cookies["userInfo"]["userName"];
            this.txt_UserPassword.Text = Request.Cookies["userInfo"]["userPassword"];
            //或
            //System.Collections.Specialized.NameValueCollection UserInfoCookieCollection;
            //UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
            //this.txt_UserName.Text =
            //    Server.HtmlEncode(UserInfoCookieCollection["userName"]);
            //this.txt_UserPassword.Text =
            //    Server.HtmlEncode(UserInfoCookieCollection["userPassword"]);
        }
    }
}


4.修改和刪除 Cookie

修改Cookie

不能直接修改 Cookie。
更改 Cookie 的過程涉及創建一個具有新值的新 Cookie,
然後將其發送到瀏覽器來覆蓋客戶端上的舊版本 Cookie。

刪除Cookie

刪除 Cookie(即從用戶的硬盤中物理移除 Cookie)是修改 Cookie 的一種形式。
由於 Cookie 在用戶的計算機中,因此無法將其直接移除。
但是,可以讓瀏覽器來爲您刪除 Cookie。
該技術是創建一個與要刪除的 Cookie 同名的新 Cookie,
並將該 Cookie 的到期日期設置爲早於當前日期的某個日期。
當瀏覽器檢查 Cookie 的到期日期時,瀏覽器便會丟棄這個現已過期的 Cookie。
下面的代碼示例演示刪除應用程序中所有可用 Cookie 的一種方法:
複製 保存
HttpCookie aCookie;
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);
}


修改或刪除子鍵
複製 保存
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);


修改單個子鍵的方法與創建它的方法相同,如下面的示例所示:
若要刪除單個子鍵,可以操作 Cookie 的 Values 集合,該集合用於保存子鍵。
首先通過從 Cookies 對象中獲取 Cookie 來重新創建 Cookie。
然後您就可以調用 Values 集合的 Remove 方法,
將要刪除的子鍵的名稱傳遞給 Remove 方法。
接着,將 Cookie 添加到 Cookies 集合,
這樣 Cookie 便會以修改後的格式發送回瀏覽器。
下面的代碼示例演示如何刪除子鍵。
在此示例中,要移除的子鍵的名稱在變量中指定。
複製 保存
string subkeyName;
subkeyName = "userName";
HttpCookie aCookie = Request.Cookies["userInfo"];
aCookie.Values.Remove(subkeyName);
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);



5.Cookie和安全性

Cookie 的安全性問題與從客戶端獲取數據的安全性問題類似。
在應用程序中,Cookie 是另一種形式的用戶輸入,
因此很容易被他們非法獲取和利用。
由於 Cookie 保存在用戶自己的計算機上,
因此,用戶至少能看到您存儲在 Cookie 中的數據。
用戶還可以在瀏覽器向您發送 Cookie 之前更改該 Cookie。

千萬不要在 Cookie 中存儲敏感信息,如用戶名、密碼、信用卡號等等。
不要在 Cookie 中放置任何不應由用戶掌握的內容,
也不要放可能被其他竊取 Cookie 的人控制的內容。

同樣,不要輕信從 Cookie 中得到的信息。
不要假定數據與您寫出時相同;
處理 Cookie 值時採用的安全措施
應該與處理網頁中用戶鍵入的數據時採用的安全措施相同。
本主題前面的示例演示在頁面中顯示值前,
先對 Cookie 內容進行 HTML 編碼的方法,
這與在顯示從用戶處得到的任何信息之前的做法相同。

Cookie 以明文形式在瀏覽器和服務器間發送,
任何可以截獲 Web 通信的人都可以讀取 Cookie。
可以設置 Cookie 屬性,
使 Cookie 只能在使用安全套接字層 (SSL) 的連接上傳輸。
SSL 並不能防止保存在用戶計算機上的 Cookie 被讀取或操作,
但可防止 Cookie 在傳輸過程中被讀取,
因爲 Cookie 已被加密。


6.設定IE瀏覽器是否接受Cookie

1).啓動IE;
2).在“工具”菜單上,單擊“Internet選項”,打開“Internet選項”對話框;
3).單擊“隱私”選項卡,將滑塊上移到更高的隱私級別。
    如果移動到最頂端則是選擇“阻止所有的Cookie”,
    此時系統將阻止所有網站的Cookie,而且網站不能讀取計算機上已有的Cookie;
4).單擊“確定”按鈕。

出自:http://www.chenjiliang.com/Article/View.aspx?ArticleID=2609

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章