单值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。