Cookie
1.什么是Cookie
一小段文本,明文的数据,关于网站相关的文本字符串数据.一个客户端状态保持机制~
存储在客户端的浏览器内存里面或者磁盘(如果不指定过期时间,那么存储在客户端浏览器内存中,如果指定了过期时间,那么存储在客户端的磁盘上.)
cookie跟网站有关的,各个网站只能访问跟自己网站相关的cookie(自动执行!?:cookie会随着请求网站一块发送到后台,如果请求百度的时候,那么就把百度的cookie放到请求报文里面去,然后发送到后台!)
2.cookie的创建和属性
cookie的创建:
//Cookie:是一个客户端状态保持机制,(网站的数据是存在客户端),与隐藏域与ViewState对象都属于这种客户端状态保持,Cookie中存储的是关于网站相关的文本字符串数据。Cookie的存储方式有两种,如果不指定过期时间,那么存储在客户端浏览器内存中,如果指定了过期时间,那么存储在客户端的磁盘上。Cookie是与具体的网站有关的,如果我们将Cookie设置了过期时间,那么当用户在指定时间内访问我们的网站,那么属于我们网站的Cookie数据会放在请求报文中发送过来,其它网站的Cookie不会发送。 //创建Cookie. Response.Cookies["cp1"].Value = "itcast";//执行这行代码时,最后会在返回的响应报文的响应头中加上一个Set-Cookie:cp1=itcast;path=/ 返回给浏览器.由于这里没有指定过期时间,所以cookie数据"itcast"默认是存储在浏览器内存中的. //创建Cookie并且指定过期时间. Response.Cookies["cp2"].Value = "laowang"; Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(3);//指定过期时间 //删除Cookie // Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-1); //Cookie跨域(域名) Response.Cookies["cp3"].Value = "laowang"; Response.Cookies["cp3"].Domain = "xxx.com";//设置主域的。 /* *Cookie的域:浏览器往后台发送数据时候,要把cookie放到请求报文里面去,发送到后台。 *那么有个问题:请求是子域的网页,那么主域的cookie会不会发送到后台呢? *答案:是的。一块发送。如果请求时主域页面,子域的cookie是不会发送到后台的。 *如果子域想让请求主域页面的时候也一块发送到后台,设置当前Cookie的域为主域可以了。*/ Response.Cookies["cp3"].Path = "/2015-5-31"; /* * cookie可以设置一个Path来限制某个路径下面的页面才会把cookie发送到后台。 *比如:请求图片,请求一个css、js,为了提高性能,可以通过 path设置页面的所在路径,来控制cookie的发送。 */ Response.Cookies["cp3"].Expires = DateTime.Now.AddDays(3); //另外一种创建Cookie的方式。 HttpCookie cookie1 = new HttpCookie("cp4","sssss"); cookie1.Expires = DateTime.Now.AddDays(3); Response.Cookies.Add(cookie1);
cookie的读取:
//获取Cookie的值 if (Request.Cookies["cp2"] != null) { Response.Write(Request.Cookies["cp2"].Value); }
3.cookie的应用场景
记住登录用户名
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="CZBK.ItcastProject.WebApp._2015_5_31.Login" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> 用户名:<input type="text" name="txtName" value="<%=LoginUserName%>"/><br /> 密码;<input type="password" name="txtPwd" /><br /> <input type="submit" value="登录" /> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace CZBK.ItcastProject.WebApp._2015_5_31 { public partial class Login : System.Web.UI.Page { public string LoginUserName { get; set; } protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { string userName = Request.Form["txtName"]; //写到Cookie中. Response.Cookies["userName"].Value = Server.UrlEncode(userName); Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7); } else { //读Cookie。 if (Request.Cookies["userName"] != null) { string name =Server.UrlDecode(Request.Cookies["userName"].Value); LoginUserName = name; Response.Cookies["userName"].Value = Server.UrlEncode(name); Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7); } } } } }
电商购物车
自动登录
4.Cookie图例
****
5.Cookie的相关问题
1)大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。
2)浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。
3)有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。
4)Cookie的另外一个创建方法:
//另外一种创建Cookie的方式。 HttpCookie cookie1 = new HttpCookie("cp4","sssss"); cookie1.Expires = DateTime.Now.AddDays(3); Response.Cookies.Add(cookie1);
5)多值Cookie
Response.Cookies["userInfo"]["userName"] = "patrick"; Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString(); Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1); HttpCookie aCookie = new HttpCookie("userInfo"); aCookie.Values["userName"] = "patrick"; aCookie.Values["lastVisit"] = DateTime.Now.ToString(); aCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie);
6)控制Cookie范围
默认情况下,一个站点的全部 Cookie 都一起存储在客户端上,而且所有 Cookie 都会随着对该站点发送的任何请求一起发送到服务器。也就是说,一个站点中的每个页面都能获得该站点的所有 Cookie。但是,可以通过两种方式设置 Cookie 的范围:
-
将 Cookie 的范围限制到服务器上的某个文件夹,这允许您将 Cookie 限制到站点上的某个应用程序。( Cookie 的 Path 属性)
HttpCookie appCookie = new HttpCookie("AppCookie"); appCookie.Value = "written " + DateTime.Now.ToString(); appCookie.Expires = DateTime.Now.AddDays(1); appCookie.Path = "/Application1"; Response.Cookies.Add(appCookie);
-
将范围设置为某个域,这允许您指定域中的哪些子域可以访问 Cookie。
Response.Cookies["domain"].Value = DateTime.Now.ToString(); Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1); Response.Cookies["domain"].Domain = "support.contoso.com";
**如果要多个子域共享Cookie,则将子域中的Cookie的Domain值设置为主域的
Response.Cookies["domain"].Value = DateTime.Now.ToString(); Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1); Response.Cookies["domain"].Domain = "contoso.com";
7)读取Cookie (多值Cookie的读取)
if(Request.Cookies["userName"] != null) Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value); if(Request.Cookies["userName"] != null) { HttpCookie aCookie = Request.Cookies["userName"]; Label1.Text = Server.HtmlEncode(aCookie.Value); }
if(Request.Cookies["userInfo"] != null) { Label1.Text = Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]); Label2.Text = Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]); }
if(Request.Cookies["userInfo"] != null) { System.Collections.Specialized.NameValueCollection UserInfoCookieCollection; UserInfoCookieCollection = Request.Cookies["userInfo"].Values; Label1.Text = Server.HtmlEncode(UserInfoCookieCollection["userName"]); Label2.Text = Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]); }
8)修改和删除Cookie
删除Cookie,实际上是修改Cookie的生存时间:
Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-1);
修改Cookie的本质:创建一个具有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie
9)Cookie的不安全
因为Cookie存在客户端的,所以不安全,加密!一些不重要的信息
10)确定浏览器是否接受Cookie
确定 Cookie 是否被接受的一种方法是尝试编写一个 Cookie,然后再尝试读取该 Cookie。如果无法读取您编写的 Cookie,则可以假定浏览器不接受 Cookie。
第一个页面:设置一个TestCookie,然后跳转到第二个页面
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { if (Request.QueryString["AcceptsCookies"] == null) { Response.Cookies["TestCookie"].Value = "ok"; Response.Cookies["TestCookie"].Expires = DateTime.Now.AddMinutes(1); Response.Redirect("TestForCookies.aspx?redirect=" + Server.UrlEncode(Request.Url.ToString())); } else { Label1.Text = "Accept cookies = " + Server.UrlEncode( Request.QueryString["AcceptsCookies"]); } } }
第二个页面:
protected void Page_Load(object sender, EventArgs e) { string redirect = Request.QueryString["redirect"]; string acceptsCookies; if(Request.Cookies["TestCookie"] ==null) acceptsCookies = "no"; else { acceptsCookies = "yes"; // Delete test cookie. Response.Cookies["TestCookie"].Expires = DateTime.Now.AddDays(-1); } Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies, true); }
Session