ASP.NET_ASP.NET Cookies

本文内容

  • 单值 Cookie
  • 多值 Cookie
  • 限制 Cookie
  • 遍历 Cookie
  • 更改 Cookie
  • 确定浏览器是否支持 Cookie

 

单值 Cookie

SingleCookie.aspx 页面
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
 
    <script runat="server">
   1:  
   2:         protected void BtnCookie_Click(object sender, EventArgs e)
   3:         {
   4:             HttpCookie cookieName = new HttpCookie("Name");
   5:             HttpCookie cookieLastVisit = new HttpCookie("lastVisit");
   6:             
   7:             cookieName.Value = TextBox1.Text;
   8:             cookieName.Expires = DateTime.Now.AddDays(1);
   9:             
  10:             cookieLastVisit.Value = DateTime.Now.ToString();
  11:             cookieLastVisit.Expires = DateTime.Now.AddDays(1);
  12:             
  13:             Response.AppendCookie(cookieName);
  14:             Response.AppendCookie(cookieLastVisit);
  15:             //Response.Cookies.Add(cookieName);
  16:             //Response.Cookies.Add(cookieLastVisit);
  17:             
  18:             Response.Redirect("SingleCookieRec.aspx");
  19:             //Server.Transfer("SingleCookieRec.aspx");
  20:         }
  21:         //protected void BtnCookie_Click(object sender, EventArgs e)
  22:         //{
  23:         //    Response.Cookies["Name"].Value = TextBox1.Text;
  24:         //    Response.Cookies["Name"].Expires = DateTime.Now.AddDays(1);
  25:  
  26:         //    HttpCookie aCookie = new HttpCookie("lastVisit");
  27:         //    aCookie.Value = DateTime.Now.ToString();
  28:         //    aCookie.Expires = DateTime.Now.AddDays(1);
  29:         
  30:         //    Response.Cookies.Add(aCookie);
  31:         
  32:         //    Response.Redirect("SingleCookieRec.aspx");
  33:         //}
  34:     
</script>
 
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server" ForeColor="Red" Width="250px">Name</asp:TextBox>
        <asp:Button ID="BtnCookie" runat="server" OnClick="BtnCookie_Click" Text="BtnCookie" />
    </div>
    </form>
</body>
</html>
SingleCookieRec.aspx 页面
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
 
    <script runat="server">
   1:  
   2:         protected void Page_Load(object sender, EventArgs e)
   3:         {
   4:             #region 读取Cookie
   5:             string value = string.Empty;
   6:             if (Request.Cookies["Name"] != null)
   7:             {
   8:                 value = Server.HtmlEncode(Request.Cookies["Name"].ToString());
   9:                 Response.Write(value + "<br />");
  10:             }
  11:             if (Request.Cookies["lastVisit"] != null)
  12:             {
  13:                 HttpCookie aCookie = Request.Cookies["lastVisit"];
  14:                 value = Server.HtmlEncode(aCookie.Value);
  15:                 Response.Write(value + "<br />");
  16:             }
  17:  
  18:             #endregion
  19:             #region 删除Cookie
  20:             HttpCookie dCookie;
  21:             string cookieName;
  22:             int limit = Request.Cookies.Count;
  23:             for (int i = 0; i < limit; i++)
  24:             {
  25:                 cookieName = Request.Cookies[i].Name;
  26:                 dCookie = new HttpCookie(cookieName);
  27:                 dCookie.Expires = DateTime.Now.AddDays(-1);
  28:                 Response.Write("Cookies 的内容:" + cookieName + "</br>");
  29:                 Response.Cookies.Add(dCookie);
  30:             }
  31:             #endregion
  32:         } 
  33:     
</script>
 
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>
</html>

说明

(1) 本例演示向Cookies集合添加两个Cookie,读取完后删除;

(2) 可以用两种方式向Cookies集合添加Cookie;

(3) 一种方式是创建一个HttpCookie类的对象,设置相应属性,再通过Add方法将其添加到Cookies集合,既可以用Response.AppendCookie()方法,也可以用Response.Cookies.Add()方法;

(4) 另一种是直接设置Cookies;

(5) 读取时,要注意使用Server.HtmlEncode()。

 

多值 Cookie

MultiCookie.aspx 页面
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
 
    <script runat="server">
   1:  
   2:         protected void BtnCookie_Click(object sender, EventArgs e)
   3:         {
   4:             Response.Cookies["userInfo"]["userName"] = "anonymous ";
   5:             Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
   6:             Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
   7:             
   8:             //HttpCookie aCookie = new HttpCookie("userInfo");
   9:             //aCookie.Values["userName"] = "anonymous";
  10:             //aCookie.Values["lastVisit"] = DateTime.Now.ToString();
  11:             //aCookie.Expires = DateTime.Now.AddDays(1);
  12:             //Response.Cookies.Add(aCookie);
  13:             Response.Redirect("MultiCookieRec.aspx");
  14:         }
  15:     
</script>
 
</head>
<body>
    <form id="form1" runat="server">
    <asp:Button ID="BtnCookie" runat="server" OnClick="BtnCookie_Click" Text="BtnCookie" />
    </form>
</body>
</html>
MultiCookieRec.aspx 页面
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
 
    <script runat="server">
   1:  
   2:         protected void Page_Load(object sender, EventArgs e)
   3:         {
   4:             if (Request.Cookies["userInfo"] != null)
   5:             {
   6:                 Response.Write(Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]) + "</br>");
   7:                 Response.Write(Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]) + "</br>");
   8:                 //DateTime.Parse(Request.Cookies["userInfo"]["lastVisit"]);
   9:             }
  10:             //if (Request.Cookies["userInfo"] != null)
  11:             //{
  12:             //    System.Collections.Specialized.NameValueCollection UserInfoCookieCollection;
  13:             //    UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
  14:             //    Response.Write(Server.HtmlEncode(UserInfoCookieCollection["userName"]) + "</br>");
  15:             //    Response.Write(Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]) + "</br>");
  16:             //}
  17:             HttpCookie dCookie;
  18:             string cookieName;
  19:             int limit = Request.Cookies.Count;
  20:             for (int i = 0; i < limit; i++)
  21:             {
  22:                 cookieName = Request.Cookies[i].Name;
  23:                 dCookie = new HttpCookie(cookieName);
  24:                 dCookie.Expires = DateTime.Now.AddDays(-1);
  25:                 Response.Write("Cookies 的内容:" + cookieName + "</br>");
  26:                 Response.Cookies.Add(dCookie);
  27:             }
  28:         }
  29:     
</script>
 
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>
</html>

说明

(1) 本例演示多值Cookie,读取后删除;

(2) 可以用两种方式读取。

 

限制 Cookie

限制到某个文件夹或应用程序
HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
appCookie.Path = "~/CookieApplication";
Response.Cookies.Add(appCookie);
Response.Redirect("CookieApplication/Default.aspx"); 

说明

(1) 路径可以是站点根目录下的物理路径,也可以是虚拟根目录;

(2) 所产生的效果是 Cookie 只能用于CookieApplication文件夹或虚拟根目录中的页面。

例如,如果您的站点名称为  www.contoso.com,则在前面示例中创建的 Cookie 将只能用于路径为 http://www.contoso.com/Application1/ 的页面以及该文件夹下的所有页面。

但是,Cookie 将不能用于其他应用程序中的页面,如 http://www.contoso.com/Application2/http://www.contoso.com/ 中的页面。

限制 Cookie 的域范围
Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "contoso.com";

说明

(1) 默认情况下,Cookie 与特定域关联。

例如,如果您的站点是  www.contoso.com,那么当用户向该站点请求任何页时,您编写的 Cookie 就会被发送到服务器。

如果站点具有子域(例如,contoso.com、sales.contoso.com 和 support.contoso.com),则可以将 Cookie 与特定的子域关联。

当以此方式设置域时,Cookie将仅可用于指定的子域中的页面。还可以使用 Domain 属性创建可在多个子域间共享的 Cookie。

(2) 本例的Cookie将可用于主域,也可用于 sales.contoso.com 和 support.contoso.com 域。

 

遍历 Cookie

StringBuilder output = new StringBuilder();
HttpCookie aCookie;
 for (int i = 0; i < Request.Cookies.Count; i++)
{
  aCookie = Request.Cookies[i];
  output.Append("Cookie name = " + Server.HtmlEncode(aCookie.Name)
          + "<br />");
  output.Append("Cookie value = " + Server.HtmlEncode(aCookie.Value)
          + "<br /><br />");
}
Response.Write(output.ToString());

但是,上面这个示例有一个限制:

(1) 如果 Cookie 有子键,则会以一个名称/值字符串来显示子键。

(2) 可以读取 Cookie 的 HasKeys 属性,以确定 Cookie 是否有子键。如果有,则可以读取子键集合;

(3) 通过索引值直接从 Values 集合中读取子键值。相应的子键名称可在 Values 集合的 AllKeys 成员中获得;

(4) 还可以使用 Values 集合的 Keys 成员。但是,首次访问 AllKeys 属性时,该属性会被缓存;

(5) 相比之下,每次访问 Keys 属性时,该属性都生成一个数组。因此在同一页请求的上下文内,在随后访问时,AllKeys 属性要快得多。

for (int i = 0; i < Request.Cookies.Count; i++)
{
  aCookie = Request.Cookies[i];
  output.Append("Name = " + aCookie.Name + "<br />");
  if (aCookie.HasKeys)
  {
    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
  {
    output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
        "<br /><br />");
  }
}
Response.Write(output.ToString());

或者,可将子键作为 NameValueCollection 对象提取:

System.Text.StringBuilder output = new System.Text.StringBuilder();
HttpCookie aCookie;
string subkeyName;
string subkeyValue;   
for (int i = 0; i < Request.Cookies.Count; i++)
{
  aCookie = Request.Cookies[i];
  output.Append("Name = " + aCookie.Name + "<br />");
  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
  {
    output.Append("Value = " + Server.HtmlEncode(aCookie.Value) +
        "<br /><br />");
  }
}
Response.Write(output.ToString());

 

更改 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();
Response.Cookies["counter"].Expires = DateTime.Now.AddDays(1);

说明

(1) 本代码演示如何更改存储用户对站点的访问次数的 Cookie 的值;

(1) 不能直接修改 Cookie。更改 Cookie 的过程涉及创建一个有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。

 

确定浏览器是否支持 Cookie

SupportCookie.aspx 页面
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
 
    <script runat="server">
   1:  
   2:         protected void Page_Load(object sender, EventArgs e)
   3:         {
   4:             if (!Page.IsPostBack)
   5:             {
   6:                 if (Request.QueryString["AcceptsCookies"] == null)
   7:                 {
   8:                     Response.Cookies["TestCookie"].Value = "ok";
   9:                     Response.Cookies["TestCookie"].Expires = DateTime.Now.AddMinutes(1);
  10:                     Response.Redirect("SupportCookieRec.aspx?redirect=" + Server.UrlEncode(Request.Url.ToString()));
  11:                 }
  12:                 else
  13:                 {
  14:                     Label1.Text = "Accept cookies = " + Server.UrlEncode(Request.QueryString["AcceptsCookies"]);
  15:                 }
  16:             }
  17:         }
  18:     
</script>
 
</head>
<body>
    <form id="form1" runat="server">
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </form>
</body>
</html>
SupportCookieRec.aspx 页面
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
 
    <script runat="server">
   1:  
   2:         protected void Page_Load(object sender, EventArgs e)
   3:         {
   4:             string redirect = Request.QueryString["redirect"];
   5:             string acceptsCookies;
   6:             if (Request.Cookies["TestCookie"] == null)
   7:                 acceptsCookies = "no";
   8:             else
   9:             {
  10:                 acceptsCookies = "yes";
  11:                 Response.Cookies["TestCookie"].Expires = DateTime.Now.AddDays(-1);
  12:             }
  13:             Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies, true);
  14:         }
  15:     
</script>
 
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>
</html>

说明

(1) 用户可将其浏览器设置为拒绝接受 Cookie。在不能写入 Cookie 时不会引发任何错误。同样,浏览器也不向服务器发送有关其当前 Cookie 设置的任何信息;

(2) 确定 Cookie 是否被接受的一种方法是尝试编写一个 Cookie,然后再尝试读取该 Cookie。如果无法读取您编写的 Cookie,则可以假定浏览器不接受 Cookie。

 

下载 Demo

posted @ 2011-08-28 23:50  船长&CAP  阅读(472)  评论(0编辑  收藏  举报
免费流量统计软件