.NET中提供了读写cookie的多种方法,Request.cookies 是客户端通过 cookie 标头形式由客户端传输到服务器的 cookie;Response.cookies 在服务器上创建并以 Set-cookie 标头的形式传输到客户端。也就是说,一个是客户端向服务器端发送的来的,一个是服务器发送到客户端的。
第一次创建cookies的时候,下面的2种读取方法读取到的内容是一样:
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("
");
Response.Write(Response.cookies["User1"].Values["UserId"].ToString());
Response.Write(Response.cookies["User2"].Values["UserName"].ToString());
但是,一旦cookie存在,再使用上面的方法进行读取,结果是有差别的,Response.cookies可以立即读取到新的cookie,而Request.cookies读取到仍是上一次设置的,也就是必须通过客户端向服务器发送请求时才能读取到。为什么会有这样的差别,应该是.NET实现的问题,里面有这么一段:
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不存在时,它应该是读取Response.cookies里面的cookie了,所以第一次读取相同,而以后读取不同的原因吧。
另外,Response.cookies必须是在设置完后读取,不能像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());
}
总结:
Request.cookies:主要是用于获取所有cookie值的,包括JS、Request.cookies和Response??.cookies三种方法创建的cookie值;说到这里,大家可以看出Request.cookies既可以获取cookie也可以创建cookie,那么它创建的cookie与Response和JS创建的cookie有什么不用呢,通过实验发现,通过Request.cookies创建的cookie只有?Request.cookies才能获取到,而其他两种方法是不能获取的,也就是说Request.cookies创建的cookie只能用于.Net后台不能用于HTML的前台。
Response.cookies:主要用于cookie的创建、赋值和删除操作,经过?Response.cookies操作过的cookie,所有方法获取到的都是被更新过的值,也就是说Response.cookies是修改所有容器中的cookie的值;Response.cookies除了是cookie的终极修改者外,我们在写代码的时候可能会发现通过Response.cookies也可以得到部分cookie的值,通过实验发现,此处获取的cookie值只是本次会话中且是通过Response.cookies创建的cookie,基本上没什么用处。



