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: else13: {
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: else9: {
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。