ASP.NET Cookies

单值Cookie

Cookie01.aspx页面

前台代码:
<asp:TextBox ID="TextBox1" runat="server" ForeColor="Red" Width="250px">Name</asp:TextBox>
<asp:Button ID="BtnCookie" runat="server" OnClick="BtnCookie_Click" Text="BtnCookie" />
后台代码:
protected void BtnCookie_Click(object sender, EventArgs e)
{
  HttpCookie cookieName = new HttpCookie("Name");
  HttpCookie cookieLastVisit = new HttpCookie("LastVisit");
  cookieName.Value = TextBox1.Text;
  cookieName.Expires = DateTime.Now.AddDays(1);
  cookieLastVisit.Value = DateTime.Now.ToString();
  cookieLastVisit.Expires = DateTime.Now.AddDays(1);
  Response.AppendCookie(cookieName);
  Response.AppendCookie(cookieLastVisit);
  //Response.Cookies.Add(cookieName);
  //Response.Cookies.Add(cookieLastVisit);
  Response.Redirect("Cookie06.aspx");
  //Server.Transfer("Cookie06.aspx");
}
这个后台代码也这么写:
protected void BtnCookie_Click(object sender, EventArgs e)
{
  Response.Cookies["Name"].Value = TextBox1.Text;
  Response.Cookies["Name"].Expires = DateTime.Now.AddDays(1);
  HttpCookie aCookie = new HttpCookie("lastVisit");
  aCookie.Value = DateTime.Now.ToString();
  aCookie.Expires = DateTime.Now.AddDays(1);
  Response.Cookies.Add(aCookie);
  Response.Redirect("Cookie06.aspx");
}

Cookie02.aspx页面

前台代码:
(无)。
后台代码:
protected void Page_Load(object sender, EventArgs e)
{
  #region 读取Cookie
  if (Request.Cookies["Name"] != null)
  {
      Response.Write(Server.HtmlEncode(Request.Cookies["Name"].ToString()) + "</br>");
  }
  if (Request.Cookies["lastVisit"] != null)
  {
      HttpCookie aCookie = Request.Cookies["lastVisit"];
      Response.Write(Server.HtmlEncode(aCookie.Value) + "</br>");
  }
  #endregion
  Response.Write("</br>");
  #region 删除Cookie
  HttpCookie dCookie;
  string cookieName;
  int limit = Request.Cookies.Count;
  for (int i = 0; i < limit; i++)
  {
      cookieName = Request.Cookies[i].Name;
      dCookie = new HttpCookie(cookieName);
      dCookie.Expires = DateTime.Now.AddDays(-1);
      Response.Write("Cookies的内容:" + cookieName + "</br>");
      Response.Cookies.Add(dCookie);
  }
  #endregion
} 

说明

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

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

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

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

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


多值Cookie

Cookie01.aspx页面

前台代码:
<asp:Button ID="BtnCookie" runat="server" OnClick="BtnCookie_Click" Text="BtnCookie" />
后台代码:
protected void BtnCookie_Click(object sender, EventArgs e)
{
  Response.Cookies["userInfo"]["userName"] = "liuning";
  Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
  Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
  //HttpCookie aCookie = new HttpCookie("userInfo");
  //aCookie.Values["userName"] = "liuning";
  //aCookie.Values["lastVisit"] = DateTime.Now.ToString();
  //aCookie.Expires = DateTime.Now.AddDays(1);
  //Response.Cookies.Add(aCookie);
  Response.Redirect("Cookie02.aspx");
}

Cookie02.aspx页面

前台代码:
(无)。
后台代码:
protected void Page_Load(object sender, EventArgs e)
{
  if (Request.Cookies["userInfo"] != null)
  {
      Response.Write(Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]) + "</br>");
      Response.Write(Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]) + "</br>");
      //DateTime.Parse(Request.Cookies["userInfo"]["lastVisit"]);
  }
  //if (Request.Cookies["userInfo"] != null)
  //{
  //    System.Collections.Specialized.NameValueCollection UserInfoCookieCollection;
  //    UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
  //    Response.Write(Server.HtmlEncode(UserInfoCookieCollection["userName"]) + "</br>");
  //    Response.Write(Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]) + "</br>");
  //}
  HttpCookie dCookie;
  string cookieName;
  int limit = Request.Cookies.Count;
  for (int i = 0; i < limit; i++)
  {
      cookieName = Request.Cookies[i].Name;
      dCookie = new HttpCookie(cookieName);
      dCookie.Expires = DateTime.Now.AddDays(-1);
      Response.Write("Cookies的内容:" + cookieName + "</br>");
      Response.Cookies.Add(dCookie);
  }
}

说明

(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

Cookie1.aspx页面

前台代码:

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
后台代码:
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("Cookie11.aspx?redirect=" + Server.UrlEncode(Request.Url.ToString()));
    }
    else
    {
      Label1.Text = "Accept cookies = " + Server.UrlEncode(Request.QueryString["AcceptsCookies"]);
    }
  }
}

Cookie2.aspx页面

前台代码:
(无)。
后台代码:

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";
    Response.Cookies["TestCookie"].Expires = DateTime.Now.AddDays(-1);
  }
  Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies, true);
}

说明

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值