Cookie学习
Cookie 为 Web 应用程序保存用户相关信息提供了一种有用的方法。例如,当用户访问站点时,可以利用 Cookie 保存用户首选项或其他信息,这样,当用户下次再访问站点时,应用程序就可以检索以前保存的信息。用户访问网站的时候,网站会给用户一个包含过期时间的Cookie,浏览器收到Cookie后就存放在客户端的文件夹下。以后用户每次访问网站页面的时候,浏览器会根据网站的URL在本地Cookie文件夹内查找是否存在当前网站关联的Cookie,如果有的话就连同页面请求一起发送到服务器。
向客户端浏览求输出Cookie是通过Response对象来完成的,当用户通过浏览器浏览网站时,若存在该网站的相应Cookie则浏览器会将其发送给服务器,服务器通过Request对象来获取Cookie对象。也就是ASP.NET 包含两个内部 Cookie 集合。通过 HttpRequest 对象的 Cookies 集合访问的集合,包含以 Cookie 标头形式由客户端传输到服务器的 Cookie。通过 HttpResponse 对象的 Cookies 集合访问的集合包含一些新 Cookie,这些 Cookie 在服务器上创建并以 Set-Cookie HTTP 响应标头的形式传输到客户端。
在C#里面通过HttpCookie类来操作Cookie。
创建一个Cookie并将其写回到客户端
HttpCookie testCookie=new HttpCookie("firstCookie");//创建一个名为firstCookie的Cookie对象。
// HttpCookie testCookie=new HttpCookie("firstCookie","value1");//创建一个名为firstCookie的对象并且其只有一个值是"value"
testCookie.Expires=DateTime.Now.AddDays(1);//设置Cookie的过期时间
Response.Cookie.Add(testCookie);//将该Cookie输出到浏览器
/*下面的是创建多值的Cookie*/
HttpCookie MultiValueCookie = new HttpCookie("cookieTest2");
MultiValueCookie.Values.Add("key1","value2");
MultiValueCookie.Values.Add("key2","value3");
MultiValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(MultiValueCookie);
在服务器端读取Cookie
HttpCookie SingleValuesCookie=Request.Cookies["cookieTest1"];
Response.Write(SingleValuesCookie.Value);//输出Cookie的值
Response.Write(SingleValuesCookie.Expires);//输出Cookie的过期时间
- 我们发现,所有Cookie的过期时间都不能正常显示。这是因为浏览器返回给服务器的Cookie是不包含过期时间的,而服务器返回给浏览器的Cookie是包含过期时间的。过期时间只对客户端浏览器有意义,对服务器来说没有什么意义。(在此产生一个疑问就是怎么在服务器端判断获取的Cookie已经过期)
删除Cookie
下面是删除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);
}
}
我们始终要记住,服务器不能直接删除Cookie,删除Cookie的操作是浏览器进行的。说是删除,其实是把它的过期时间设置为过去的时间,让Cookie过期。因此,对于删除操作来说有三个步骤。
1.从Request对象中获取Cookie。
2.把Cookie的过期时间设置为过去的时间。
3.把Cookie重新写回Response中。
4.修改Cookie的操作也非常简单。
protected void btn_ModifyCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = Request.Cookies["test1"];
SingleValueCookie.Value = "修改后的单值Cookie";
Response.Cookies.Add(SingleValueCookie);
}
Cookie总结
Cookie虽然是一个简单实用的对象,但是我们也要注意Cookie的工作原理、大小限制以及安全性等,大致可以归纳为以下几点。
- 存储的物理位置。客户端的Cookies文件夹内。
- 存储的类型限制。字符串。
- 状态使用的范围。当前请求上下文的上下文都能访问到Cookie,Cookie对每个用户来说都是独立的。
- 存储的大小限制。每个Cookie不超过4K数据。每个网站不超过20个Cookie。所有网站的Cookie总和不超过300个。
- 生命周期。每个Cookie都有自己的过期时间,超过了过期时间后失效。
- 安全与性能。存储在客户端,安全性差。对于敏感数据建议加密后存储。
- 优点缺点与注意事项。可以很方便地关联网站和用户,长久保存用户设置。