C#中Request.Cookies 和 Response.Cookies 的区别分析
.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("<hr>");
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,基本上没什么用处。