Cookie 知识点收集

  由于要写一个登陆认证过程,网上查半天没什么头绪,索性从Cookie的基础知识了解起,现对Cookie的知识点收集如下,方便以后查阅,O(∩_∩)O!

1:cookie是在客户端存储用户信息的一个小文件,一般文件大小不超过4096 字节,大多数站点一般只允许每个站点存储 20 个 Cookie,如果超过,系统将会自动覆盖。

2:Cookies的工作原理:第一次是由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生

  HTML代码返回给客户端,这是一个很重要的原理。

3:cookie的存储形式:是以名/值对的形式保存下来的  UserID A9A3BECE0563982D www.goto.com/ 

  创建 Cookie 时,需要指定 Name 和 Value。每个 Cookie 必须有一个唯一的名称,以便以后从浏览器读取 Cookie 时可以识别它。

4:如果没有设置 Cookie 的有效期,仍会创建 Cookie,但不会将其存储在用户的硬盘上。而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 便

  会被丢弃。  cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

Cookie的属性: 

  Domain(域名):获得或设置与cookie有关的域名,可用于限制特定区域的cookie访问。       

      默认情况下设置为创建网页所在的服务器主机名。若设置为“.lwx.com”,那么在这个域的服务器都可使用,如www.lwx.comwww.2008.lwx.com都可以使用;

  Expires(期限):获得或设置cookie的终止日期和时间,你可以将其设置为一个过去的日期以自动终止或者删除cookie。(已经过时的属性,被max-age取代)

  max-age:cookie生命期属性(使用秒为单位);

  Names(名称):获得或设置cookie名称。

  Path(路径):获得或设置cookie的虚拟路径。这一属性允许你限制cookie范围,也就是说,访问cookie只能限制于一个特定的文件夹或者路径。设置这一属性限制为只能访问特定

      路径和该路径下的所有文件。设置为“/”对于网页所在服务器上的网页可见。

  Secure(安全):安全属性。发信号以表示是否使用Secure Sockets Layer (SSL)来发送cookie值。默认情况下是不安全的,设置为安全,cookie只能在浏览器和服务器通过

      HTTPS或其他安全协议链接时进行传输;

  Value(值):获得或设置一个单独的cookie值。

  Values(信息):返回包含在cookie中的key/value的一个集合。

 注意:cookie的属性可以设置,但是无法读取,要修改只能把整个cookie读取出来,重新设置这些属性然后在添加!

用户系统上的Cookie由浏览器负责管理。Cookie 通过 HttpResponse 对象发送到浏览器,该对象公开称为 Cookies的集合。

Cookies的写入(Response)和读取(Request):
第一种:直接设置值
  写入Cookies: Response.cookies("UserName")=Value ;//名、值对
  设置Cookies的时间: Response.cookies("Name").Expires = date+1,表示Cookies保存1天 /  Hour+8,表示Cookies保存8小时。
第二种:创建对象实例,通过Add方法添加
  HttpCookie aCookie = new HttpCookie("lastVisit");
  aCookie.Value = DateTime.Now.ToString();
  aCookie.Expires = DateTime.Now.AddDays(1);
  Response.Cookies.Add(aCookie);

此时,Cookies集合中写入了两个Cookie,一个名为UserName,另一个名为lastVisit。

读取Cookies:

  string UserName=Request.Cookies("UserName");

带子键的Cookies写入:

一个Cookies,允许有多个名、值对,在一个 Cookie 中存储多个名称/值对。名称/值对称为子键相关或类似的信息放在一个 Cookie 中很方便,由于所有信息都在一个 Cookie 中,所以有效期之类的 Cookie 属性就适用于所有信息。(注意,如果要为不同类型的信息指定不同的到期日期,就应该把信息存储在单独的 Cookie 中。)这样就节省了Cookies的使用个数限制。  设置一个名为userInfo的Cookie,含有两个子键userName,lastVisit

第一种:直接设置值
Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

第二种:创建实例,Add添加
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);

 设置Cookies的控制范围:

通过path属性 设置Cookies的控制范围,一般一个站点中的每个页面都能获得该站点的所有 Cookie,如果要限制页面访问Cookies,通过两种方式设置 Cookie 的范围:
将 Cookie 限制到某个文件夹或应用程序:
HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
appCookie.Path = "/Application1";  //效果是 Cookie 只能用于Application1 文件夹或虚拟根目录中的页面来访问。

Response.Cookies.Add(appCookie);

设置Cookies的域范围:

通过Domain属性设置Cookies的域范围

Cookie 与特定域关联。例如,如果站点是 www.contoso.com,那么当用户向该站点请求任何页时,您编写的Cookie 就会被发送到服务器。(这可能不包括带有特定路径值的Cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 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 = "support.contoso.com"; //Cookie 将仅可用于指定的子域中的页面

如果:Response.Cookies["domain"].Domain = "contoso.com";//此时Cookies将被多个子域共享,sales.contoso.com 和 support.contoso.com都可以访问

读取Cookie并显示在页面的方法
if(Request.Cookies["userName"] != null)    //确保该 Cookie 存在
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)
{   

 //Cookie 中的子键被类型化为 NameValueCollection  子键类型的集合
System.Collections.Specialized.NameValueCollection  UserInfoCookieCollection ;        

 UserInfoCookieCollection = Request.Cookies["userInfo"].Values;    //获取子键集合
Label1.Text =  Server.HtmlEncode(UserInfoCookieCollection["userName"]); //获取子键集合中的单个子键值 
Label2.Text =  Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);
}

读取 Cookie 集合
有时,可能需要读取可供页面使用的所有 Cookie。

HttpCookie aCookie; string str;

for(int i=0; i<Request.Cookies.Count; i++)

{   

aCookie = Request.Cookies[i]; 

str+=  "Cookie name = " + Server.HtmlEncode(aCookie.Name)         + "<br />";   

str+="Cookie value = " + Server.HtmlEncode(aCookie.Value)        + "<br /><br />";

}

Label1.Text = str;

读取带子键的Cookie集合

如果 Cookie 有子键,则会以一个名称/值字符串来显示子键。可以读取 Cookie 的 HasKeys 属性,以确定 Cookie 是否有子键。如果有,则可以读取子键集合以获取各个子键名称和值。可以通过索引值直接从 Values 集合中读取子键值。相应的子键名称可在 Values 集合的 AllKeys 成员中获得,该成员将返回一个字符串数组。

HttpCookie aCookie;

for(int i=0; i<Request.Cookies.Count; i++)

{   

   aCookie = Request.Cookies[i];   

  output.Append("Name = " + aCookie.Name + "<br />");   

  if(aCookie.HasKeys)    //确定Cookie是否有子键 

  {       

    for(int j=0; j<aCookie.Values.Count; j++)       

    {           

      subkeyName = Server.HtmlEncode(aCookie.Values.AllKeys[j]);    //获取子键名称       

      subkeyValue = Server.HtmlEncode(aCookie.Values[j]);           

      output.Append("Subkey name = " + subkeyName + "<br />");           

       output.Append("Subkey value = " + subkeyValue +  "<br /><br />");       

    }   

  }   

  else    //无子键则输出该Cookie的值  (名--值对)

  {       

    output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +   "<br /><br />");   

  }

}

Label1.Text = output.ToString();

或者,可将子键作为 NameValueCollection 对象提取 (子键集合)

  if (aCookie.HasKeys)   

{       

System.Collections.Specialized.NameValueCollection CookieValues = aCookie.Values; 子键集合,即子键名值对      

string[] CookieValueNames = CookieValues.AllKeys;   //获取所有子键名集合

for (int j = 0; j < CookieValues.Count; j++)       

{           

subkeyName = Server.HtmlEncode(CookieValueNames[j]);           

subkeyValue = Server.HtmlEncode(CookieValues[j]);  //子键值         

output.Append("Subkey name = " + subkeyName + "<br />");           

output.Append("Subkey value = " + subkeyValue +   "<br /><br />");       

}    }   

else   

{ 无子键时,输出value}}

修改和删除 Cookie

修改 Cookie

不能直接修改 Cookie。更改 Cookie 的过程涉及创建一个具有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。下面更改存储用户对站点的访问次数的 Cookie 的值:

int counter;

if (Request.Cookies["counter"] == null)   

counter = 0;

else

{   

counter = int.Parse(Request.Cookies["counter"].Value);

}

counter++;

Response.Cookies["counter"].Value = counter.ToString();  //创建一个具有新值的同名Cookie

Response.Cookies["counter"].Expires = DateTime.Now.AddDays(1);

 
删除 Cookie
删除 Cookie(即从用户的硬盘中物理移除 Cookie)是修改 Cookie 的一种形式。由于 Cookie 在用户的计算机中,因此无法将其直接移除。但是,可以让浏览器来为您删除 Cookie。该技术是创建一个与要删除的 Cookie 同名的新 Cookie,并将该 Cookie 的到期日期设置为早于当前日期的某个日期。当浏览器检查 Cookie 的到期日期时,浏览器便会丢弃这个现已过期的 Cookie。下面的代码示例演示删除应用程序中所有可用 Cookie 的一种方法:

HttpCookie aCookie;

string cookieName;

int limit = Request.Cookies.Count;

for (int i=0; i<limit; i++){   

cookieName = Request.Cookies[i].Name;   

 aCookie = new HttpCookie(cookieName);   

aCookie.Expires = DateTime.Now.AddDays(-1); //早于当前的某个日期  

Response.Cookies.Add(aCookie);}

修改或删除子键修改单个子键的方法与创建它的方法相同,如下面的示例所示:

Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();

Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

若要删除单个子键,可以操作 Cookie 的 Values 集合,该集合用于保存子键。首先通过从 Cookies 对象中获取 Cookie 来重新创建 Cookie。然后您就可以调用 Values 集合的 Remove 方法,将要删除的子键的名称传递给 Remove 方法。接着,将 Cookie 添加到 Cookies 集合,这样 Cookie 便会以修改后的格式发送回浏览器。下面的代码示例演示如何删除子键。在此示例中,要移除的子键的名称在变量中指定。

string subkeyName;  subkeyName = "userName";

HttpCookie aCookie = Request.Cookies["userInfo"];

aCookie.Values.Remove(subkeyName);  //aCookie.Values 子键集合移除单个子键

aCookie.Expires = DateTime.Now.AddDays(1);

Response.Cookies.Add(aCookie);

原文地址:https://www.cnblogs.com/Joans/p/1825993.html