0.相关概念及知识
1.编写和保存Cookie
2.列举Cookie
3.读取Cookie
4.修改和删除Cookie
5.Cookie和安全性
6.设定IE浏览器是否接受Cookie
======================================================
0.相关概念及知识
==================
Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法。
例如,当用户访问您的站点时,
您可以使用 Cookie 存储用户首选项或其他信息。
当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。
什么是 Cookie?
---------------
Cookie 是一小段文本信息,
伴随着用户请求和页面在 Web 服务器和浏览器之间传递。
Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
例如,
如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,
还有一个包含日期和时间的 Cookie,
用户的浏览器在获得页面的同时还获得了该 Cookie,
并将它存储在用户硬盘上的某个文件夹中。
以后,如果该用户再次请求您站点中的页面,
当该用户输入 URL 时,浏览器便会在本地硬盘上查找与该 URL 关联的 Cookie。
如果该 Cookie 存在,浏览器便将该 Cookie 与页请求一起发送到您的站点。
然后,应用程序便可以确定该用户上次访问站点的日期和时间。
您可以使用这些信息向用户显示一条消息,也可以检查到期日期。
Cookie 与网站关联,而不是与特定的页面关联。
因此,无论用户请求站点中的哪一个页面,浏览器和服务器都将交换 Cookie 信息。
用户访问不同站点时,各个站点都可能会向用户的浏览器发送一个 Cookie;
浏览器会分别存储所有 Cookie。
使用 Cookie 能够达到多种目的,所有这些目的都是为了帮助网站记住用户。
例如,一个实施民意测验的站点可以简单地将 Cookie 作为一个 Boolean 值,
用它来指示用户的浏览器是否已参与了投票,这样用户便无法进行第二次投票。
要求用户登录的站点则可以通过 Cookie 来记录用户已经登录,
这样用户就不必每次都输入凭据。
Cookie 的限制
--------------
大多数浏览器支持最大为 4096 字节的 Cookie。
由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,
或者存储用户 ID 之类的标识符。
用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。
浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。
大多数浏览器只允许每个站点存储 20 个 Cookie;
如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。
有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,
通常为 300 个。
虽然 Cookie 在应用程序中非常有用,但应用程序不应依赖于能够存储 Cookie。
不要使用 Cookie 支持关键功能。如果应用程序必须依赖于 Cookie,
则可以通过测试确定浏览器是否将接受 Cookie。
1.编写和保存Cookie
==================
//保存用户名和密码
protected void Button1_Click(object sender, EventArgs e)
{
//因为涉及到密码等的保存 最好是用MD5等加密后 再保存
Response.Cookies["userInfo"]["userName"] = this.txt_UserName.Text.Trim();
if (this.chk_SavePWD.Checked)
Response.Cookies["userInfo"]["userPassword"] = this.txt_UserPassword.Text.Trim();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
//或
//HttpCookie aCookie = new HttpCookie("userInfo");
//aCookie.Values["userName"] = this.txt_UserName.Text.Trim();
//if (this.chk_SavePWD.Checked)
// aCookie.Values["userPassword"] = this.txt_UserPassword.Text.Trim();
//aCookie.Expires = DateTime.Now.AddDays(-1);//立即失效
//Response.Cookies.Add(aCookie);
}
2.列举Cookie
=============
//列出相关Cookie
protected void Button2_Click(object sender, EventArgs e)
{
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)
{
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 />");
}
}
this.Label1.Text= output.ToString();
}
3.读取Cookie
=============
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//读取相关保存值
if (Request.Cookies["userInfo"] != null)
{
this.txt_UserName.Text = Request.Cookies["userInfo"]["userName"];
this.txt_UserPassword.Text = Request.Cookies["userInfo"]["userPassword"];
//或
//System.Collections.Specialized.NameValueCollection UserInfoCookieCollection;
//UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
//this.txt_UserName.Text =
// Server.HtmlEncode(UserInfoCookieCollection["userName"]);
//this.txt_UserPassword.Text =
// Server.HtmlEncode(UserInfoCookieCollection["userPassword"]);
}
}
}
4.修改和删除 Cookie
====================
修改Cookie
-----------
不能直接修改 Cookie。
更改 Cookie 的过程涉及创建一个具有新值的新 Cookie,
然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。
删除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.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
5.Cookie和安全性
================
Cookie 的安全性问题与从客户端获取数据的安全性问题类似。
在应用程序中,Cookie 是另一种形式的用户输入,
因此很容易被他们非法获取和利用。
由于 Cookie 保存在用户自己的计算机上,
因此,用户至少能看到您存储在 Cookie 中的数据。
用户还可以在浏览器向您发送 Cookie 之前更改该 Cookie。
千万不要在 Cookie 中存储敏感信息,如用户名、密码、信用卡号等等。
不要在 Cookie 中放置任何不应由用户掌握的内容,
也不要放可能被其他窃取 Cookie 的人控制的内容。
同样,不要轻信从 Cookie 中得到的信息。
不要假定数据与您写出时相同;
处理 Cookie 值时采用的安全措施
应该与处理网页中用户键入的数据时采用的安全措施相同。
本主题前面的示例演示在页面中显示值前,
先对 Cookie 内容进行 HTML 编码的方法,
这与在显示从用户处得到的任何信息之前的做法相同。
Cookie 以明文形式在浏览器和服务器间发送,
任何可以截获 Web 通信的人都可以读取 Cookie。
可以设置 Cookie 属性,
使 Cookie 只能在使用安全套接字层 (SSL) 的连接上传输。
SSL 并不能防止保存在用户计算机上的 Cookie 被读取或操作,
但可防止 Cookie 在传输过程中被读取,
因为 Cookie 已被加密。
6.设定IE浏览器是否接受Cookie
===========================
1).启动IE;
2).在“工具”菜单上,单击“Internet选项”,打开“Internet选项”对话框;
3).单击“隐私”选项卡,将滑块上移到更高的隐私级别。
如果移动到最顶端则是选择“阻止所有的Cookie”,
此时系统将阻止所有网站的Cookie,而且网站不能读取计算机上已有的Cookie;
4).单击“确定”按钮。