1. 程式人生 > >Cookie與自動儲存

Cookie與自動儲存

<iframe marginwidth="0" marginheight="0" src="http://218.16.120.35:65001/PC/Global/images/b.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
0.相關概念及知識
1.編寫和儲存Cookie
2.列舉Cookie
3.讀取Cookie
4.修改和刪除Cookie
5.Cookie和安全性
6.設定IE瀏覽器是否接受Cookie

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

複製C#程式碼儲存程式碼
//儲存使用者名稱和密碼
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
複製C#程式碼儲存程式碼
//列出相關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
複製C#程式碼儲存程式碼
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的一種方法:
複製C#程式碼儲存程式碼
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);
}


修改或刪除子鍵
複製C#程式碼儲存程式碼
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便會以修改後的格式傳送回瀏覽器。
下面的程式碼示例演示如何刪除子鍵。
在此示例中,要移除的子鍵的名稱在變數中指定。
複製C#程式碼儲存程式碼
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).單擊“確定”按鈕。