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();//指定过期时间 //删除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(); //另外一种创建Cookie的方式。
HttpCookie cookie1 = new HttpCookie("cp4","sssss");
cookie1.Expires = DateTime.Now.AddDays();
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(); }
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();
}
}
}
}
}
电商购物车
自动登录
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();
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(); HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays();
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();
appCookie.Path = "/Application1";
Response.Cookies.Add(appCookie);
将范围设置为某个域,这允许您指定域中的哪些子域可以访问 Cookie。
Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays();
Response.Cookies["domain"].Domain = "support.contoso.com";
**如果要多个子域共享Cookie,则将子域中的Cookie的Domain值设置为主域的
Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays();
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(-);
修改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();
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(-);
}
Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies,
true);
}
Session