ASP.NET中Cookie的使用方法
來(lái)源:易賢網(wǎng) 閱讀:635 次 日期:2016-08-09 15:15:59
溫馨提示:易賢網(wǎng)小編為您整理了“ASP.NET中Cookie的使用方法”,方便廣大網(wǎng)友查閱!

Cookie 為 Web 應(yīng)用程序保存用戶相關(guān)信息提供了一種有用的方法。例如,當(dāng)用戶訪問(wèn)站點(diǎn)時(shí),可以利用 Cookie 保存用戶首選項(xiàng)或其他信息,這樣,當(dāng)用戶下次再訪問(wèn)站點(diǎn)時(shí),應(yīng)用程序就可以檢索以前保存的信息。

從技術(shù)上講,Cookie是小段保存在客戶端的數(shù)據(jù)(如果你安裝的是XP,可以看一下<安裝Windows的盤>:\Documents and Settings\<用戶名>\Cookies文件夾)。用戶訪問(wèn)網(wǎng)站的時(shí)候,網(wǎng)站會(huì)給用戶一個(gè)包含過(guò)期時(shí)間的Cookie,瀏覽器收到Cookie后就存放在客戶端的文件夾下。以后用戶每次訪問(wèn)網(wǎng)站頁(yè)面的時(shí)候,瀏覽器會(huì)根據(jù)網(wǎng)站的URL在本地Cookie文件夾內(nèi)查找是否存在當(dāng)前網(wǎng)站關(guān)聯(lián)的Cookie,如果有的話就連同頁(yè)面請(qǐng)求一起發(fā)送到服務(wù)器。

一、關(guān)于Cookie的知識(shí)還需要了解以下幾點(diǎn)。

·Cookie只是一段字符串,并不能執(zhí)行。

·大多數(shù)瀏覽器規(guī)定Cookie大小不超過(guò)4K,每個(gè)站點(diǎn)能保存的Cookie不超過(guò)20個(gè),所有站點(diǎn)保存的Cookie總和不超過(guò)300個(gè)。

·除了Cookie外,幾乎沒(méi)有其他的方法在客戶端的機(jī)器上寫入數(shù)據(jù)(就連Cookie的寫入操作也是瀏覽器進(jìn)行的)。當(dāng)然,連Cookie都可以通過(guò)瀏覽器安全配置來(lái)禁止。如果你使用IE瀏覽器,可以看一下“工具”→“Internet”選項(xiàng)→“隱私”一頁(yè)?,F(xiàn)在的大多數(shù)網(wǎng)站都利用Cookie來(lái)保存一些數(shù)據(jù)(比如你的ID),以便你下一次訪問(wèn)網(wǎng)站時(shí)能直接“繼續(xù)”以前的配置,所以我還是建議你不要輕易關(guān)閉Cookie。

在使用Cookie時(shí),必須意識(shí)到其固有的安全弱點(diǎn)。Cookie畢竟是存放于客戶端的。因此,不要在Cookie中保存保密信息,如用戶名、密碼、信用卡號(hào)等。在Cookie中不要保存不應(yīng)該由用戶掌握的內(nèi)容,也不要保存可能被其他竊取Cookie的人控制的內(nèi)容。

二、Cookie的使用

下面,我們就來(lái)討論如何保存、讀取、刪除和修改Cookie。首先在頁(yè)面上添加4個(gè)按鈕用來(lái)完成這4個(gè)操作。

代碼如下:

<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的方法如下。

代碼如下:

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);

}

我們可以看到,一個(gè)Cookie中允許保存單個(gè)值也可以保存多個(gè)值。HttpCookie類型表示一個(gè)Cookie,Expires屬性用于修改Cookie的過(guò)期時(shí)間。對(duì)于單值Cookie,既可以直接在構(gòu)造方法中指定值也可以使用Value屬性指定值。對(duì)于多值Cookie,既可以使用Values屬性的Add方法添加子鍵和值,也可以直接使用Values屬性的索引設(shè)置子鍵和值。上面這段代碼等價(jià)于下面這段代碼。

代碼如下:

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對(duì)象把Cookie重新返回給瀏覽器。我們的服務(wù)器不能直接在客戶端機(jī)器上寫Cookie,而是由瀏覽器完成這一工作,當(dāng)然用戶也可以設(shè)置是否允許瀏覽器讀寫Cookie。

下面是讀取Cookie的操作。

代碼如下:

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));

        }

    }

}

對(duì)于多值Cookie,我們通過(guò)遍歷AllKeys屬性返回的字符串?dāng)?shù)組獲取所有子鍵Key,從而獲得子鍵的值。要注意的是,在訪問(wèn)Cookie以前,需要檢測(cè)一下Cookie是否存在。打開(kāi)頁(yè)面,先單擊“保存Cookie”按鈕,然后單擊“讀取Cookie”按鈕,得到以下輸出:

Key:test1 Value:單值Cookie Expires:0001-1-1 0:00:00

Key:test2 Value:key1=value1&key2=value2

SubKey:key1 Value:value1 Expires:0001-1-1 0:00:00

SubKey:key2 Value:value2 Expires:0001-1-1 0:00:00

這里要說(shuō)明以下幾點(diǎn)。

·我們發(fā)現(xiàn),所有Cookie的過(guò)期時(shí)間都不能正常顯示。這是因?yàn)闉g覽器返回給服務(wù)器的Cookie是不包含過(guò)期時(shí)間的,而服務(wù)器返回給瀏覽器的Cookie是包含過(guò)期時(shí)間的。過(guò)期時(shí)間只對(duì)客戶端瀏覽器有意義,對(duì)服務(wù)器來(lái)說(shuō)沒(méi)有什么意義。

·直接讀取多值Cookie的Value,它會(huì)把所有子鍵和子鍵值都使用key=value方法顯示,多個(gè)子鍵使用“&”連接(類似URL的方式)。

下面是刪除Cookie的操作。

代碼如下:

protected void btn_DelCookie_Click(object sender, EventArgs e)

{

    HttpCookie SingleValueCookie = Request.Cookies["test1"];

    SingleValueCookie.Expires = DateTime.MinValue;

    Response.Cookies.Add(SingleValueCookie);

}

如果你想刪除所有Cookie,可以遍歷刪除。

代碼如下:

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)行的。說(shuō)是刪除,其實(shí)是把它的過(guò)期時(shí)間設(shè)置為過(guò)去的時(shí)間,讓Cookie過(guò)期。因此,對(duì)于刪除操作來(lái)說(shuō)有三個(gè)步驟。

1.從Request對(duì)象中獲取Cookie。

2.把Cookie的過(guò)期時(shí)間設(shè)置為過(guò)去的時(shí)間。

3.把Cookie重新寫回Response中。

4.修改Cookie的操作也非常簡(jiǎn)單。

代碼如下:

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

代碼如下:

//方式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的寫法

代碼如下:

//方式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è)置過(guò)期時(shí)間 1天

Response.Cookies.Add(cookie);

(2)讀取Cookie

Internet Explorer 將站點(diǎn)的 Cookie 保存在文件名格式為 <user>@<domain>.txt 的文件中,其中 <user> 是您的帳戶名。

注意:在獲取Cookie的值之前,應(yīng)該確保該 Cookie 確實(shí)存在。否則,您將得到一個(gè)異常

代碼如下:

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 ;i<Request.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;j<NameColl.Count;j++)

        {

            Response.Write("子鍵名="+ NameColl.AllKey[j] +"<br/>");

            Response.Write("子鍵值="+ NameColl[j] +"<br/>");

        }

    }

    else

    {

        Response.Write("value="+cookies.Value+"<br/>");       

    }

}

運(yùn)行此代碼時(shí),可看到一個(gè)名為“ASP.NET_SessionId”的Cookie,ASP.NET用這個(gè) Cookie 來(lái)保存您的會(huì)話的唯一標(biāo)識(shí)符。

(3)刪除 Cookie

將其有效期設(shè)置為過(guò)去的某個(gè)日期。當(dāng)瀏覽器檢查 Cookie 的有效期時(shí),就會(huì)刪除這個(gè)已過(guò)期的 Cookie。

代碼如下:

HttpCookie cookie = new HttpCookie("userinfo1");

cookie.Expires=DateTime.Now.AddDays(-30);

Response.Cookies.Add(cookie);

(4)修改cookie

代碼如下:

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è)置過(guò)期時(shí)間為現(xiàn)在就行了

int limit=Request.Cookies.Count - 1;

for(int i=0;i<limit;i++)

{

    acookie = Request.Cookies(i)

    acookie.Expires = DateTime.Now.AddDays(-1)

    Response.Cookies.Add(acookie)

}

-------------

如果有主站及二級(jí)域名站且cookie要共享的話則要加入如下設(shè)置

代碼如下:

cookie.Domain = ".主域名";

cookie.Path = "/";

四、Cookie總結(jié)

Cookie雖然是一個(gè)簡(jiǎn)單實(shí)用的對(duì)象,但是我們也要注意Cookie的工作原理、大小限制以及安全性等,大致可以歸納為以下幾點(diǎn)。

·存儲(chǔ)的物理位置??蛻舳说腃ookies文件夾內(nèi)。

·存儲(chǔ)的類型限制。字符串。

·狀態(tài)使用的范圍。當(dāng)前請(qǐng)求上下文的上下文都能訪問(wèn)到Cookie,Cookie對(duì)每個(gè)用戶來(lái)說(shuō)都是獨(dú)立的。

·存儲(chǔ)的大小限制。每個(gè)Cookie不超過(guò)4K數(shù)據(jù)。每個(gè)網(wǎng)站不超過(guò)20個(gè)Cookie。所有網(wǎng)站的Cookie總和不超過(guò)300個(gè)。

·生命周期。每個(gè)Cookie都有自己的過(guò)期時(shí)間,超過(guò)了過(guò)期時(shí)間后失效。

·安全與性能。存儲(chǔ)在客戶端,安全性差。對(duì)于敏感數(shù)據(jù)建議加密后存儲(chǔ)。

·優(yōu)點(diǎn)缺點(diǎn)與注意事項(xiàng)??梢院芊奖愕仃P(guān)聯(lián)網(wǎng)站和用戶,長(zhǎng)久保存用戶設(shè)置。

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:ASP.NET中Cookie的使用方法
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)