C#中Request.Cookies 和 Response.Cookies 的區(qū)別分析
.NET中提供了讀寫Cookie的多種方法,Request.Cookies 是客戶端通過 Cookie 標頭形式由客戶端傳輸?shù)椒?wù)器的 Cookie;Response.Cookies 在服務(wù)器上創(chuàng)建并以 Set-Cookie 標頭的形式傳輸?shù)娇蛻舳?。也就是說,一個是客戶端向服務(wù)器端發(fā)送的來的,一個是服務(wù)器發(fā)送到客戶端的。
第一次創(chuàng)建Cookies的時候,下面的2種讀取方法讀取到的內(nèi)容是一樣:
C# 代碼
HttpCookie hc = new HttpCookie("User2");
hc["UserName"] = "mengxianhui";
Response.Cookies.Add(hc);
Response.Cookies["User1"]["UserId"] = "net_lover";
Response.Write(Request.Cookies["User1"].Values["UserId"].ToString());
Response.Write(Request.Cookies["User2"].Values["UserName"].ToString());
Response.Write("<hr>");
Response.Write(Response.Cookies["User1"].Values["UserId"].ToString());
Response.Write(Response.Cookies["User2"].Values["UserName"].ToString());
但是,一旦Cookie存在,再使用上面的方法進行讀取,結(jié)果是有差別的,Response.Cookies可以立即讀取到新的Cookie,而Request.Cookies讀取到仍是上一次設(shè)置的,也就是必須通過客戶端向服務(wù)器發(fā)送請求時才能讀取到。為什么會有這樣的差別,應(yīng)該是.NET實現(xiàn)的問題,里面有這么一段:
C# 代碼
if (includeResponse && (this.Response != null))
{
HttpCookieCollection cookies = this.Response.Cookies;
if (cookies.Count > 0)
{
HttpCookie[] dest = new HttpCookie[cookies.Count];
cookies.CopyTo(dest, 0);
for (int i = 0; i < dest.Length; i++)
{
cookieCollection.AddCookie(dest[i], true);
}
}
}
在Cookie不存在時,它應(yīng)該是讀取Response.Cookies里面的Cookie了,所以第一次讀取相同,而以后讀取不同的原因吧。
另外,Response.Cookies必須是在設(shè)置完后讀取,不能像Request.Cookies那樣隨時讀取,如在別的頁面讀取Cookies,下面的方法就是錯誤的
C# 代碼
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Response.Cookies["User1"].Values["UserId"].ToString());
Response.Write(Response.Cookies["User2"].Values["UserName"].ToString());
}
總結(jié):
Request.Cookies:主要是用于獲取所有Cookie值的,包括JS、Request.Cookies和Response??.Cookies三種方法創(chuàng)建的Cookie值;說到這里,大家可以看出Request.Cookies既可以獲取Cookie也可以創(chuàng)建Cookie,那么它創(chuàng)建的Cookie與Response和JS創(chuàng)建的Cookie有什么不用呢,通過實驗發(fā)現(xiàn),通過Request.Cookies創(chuàng)建的Cookie只有?Request.Cookies才能獲取到,而其他兩種方法是不能獲取的,也就是說Request.Cookies創(chuàng)建的Cookie只能用于.Net后臺不能用于HTML的前臺。
Response.Cookies:主要用于Cookie的創(chuàng)建、賦值和刪除操作,經(jīng)過?Response.Cookies操作過的Cookie,所有方法獲取到的都是被更新過的值,也就是說Response.Cookies是修改所有容器中的Cookie的值;Response.Cookies除了是Cookie的終極修改者外,我們在寫代碼的時候可能會發(fā)現(xiàn)通過Response.Cookies也可以得到部分Cookie的值,通過實驗發(fā)現(xiàn),此處獲取的Cookie值只是本次會話中且是通過Response.Cookies創(chuàng)建的Cookie,基本上沒什么用處。
- JSP 中request與response的用法詳解
- @ResponseBody 和 @RequestBody 注解的區(qū)別
- AngularJS的ng Http Request與response格式轉(zhuǎn)換方法
- http調(diào)用webservice操作httprequest、httpresponse示例
- Asp.net response對象與request對象使用介紹
- ASP.NET筆記之 Request 、Response 與Server的使用
- JSP內(nèi)置對象:Request和Response的簡單介紹及使用
- jquery ajax學(xué)習(xí)筆記2 使用XMLHttpRequest對象的responseXML
- JSP中Servlet的Request與Response的用法與區(qū)別
相關(guān)文章
使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改(Java實現(xiàn))
本文主要介紹了Java中使用數(shù)字簽名實現(xiàn)數(shù)據(jù)庫記錄防篡改的方法與步驟。具有很好的參考價值,下面跟著小編一起來看下吧2017-01-01
C# ThreadPool之QueueUserWorkItem使用案例詳解
這篇文章主要介紹了C# ThreadPool之QueueUserWorkItem使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
使用C# Winform應(yīng)用程序獲取網(wǎng)頁源文件的解決方法
本篇文章是對使用C# Winform應(yīng)用程序獲取網(wǎng)頁源文件的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
這篇文章主要介紹了C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法,涉及C#針對注冊表的讀取與監(jiān)控技巧,非常具有實用價值,需要的朋友可以參考下2015-08-08

