由于要写一个登陆认证过程,网上查半天没什么头绪,索性从Cookie的基础知识了解起,现对Cookie的知识点收集如下,方便以后查阅,O(∩_∩)O!
1:cookie是在客户端存储用户信息的一个小文件,一般文件大小不超过4096 字节,大多数站点一般只允许每个站点存储 20 个 Cookie,如果超过,系统将会自动覆盖。
2:Cookies的工作原理:第一次是由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生
HTML代码返回给客户端,这是一个很重要的原理。
3:cookie的存储形式:是以名/值对的形式保存下来的 UserID A9A3BECE0563982D www.goto.com/
创建 Cookie 时,需要指定 Name 和 Value。每个 Cookie 必须有一个唯一的名称,以便以后从浏览器读取 Cookie 时可以识别它。
4:如果没有设置 Cookie 的有效期,仍会创建 Cookie,但不会将其存储在用户的硬盘上。而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 便
会被丢弃。 cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
Cookie的属性:
Domain(域名):获得或设置与cookie有关的域名,可用于限制特定区域的cookie访问。
默认情况下设置为创建网页所在的服务器主机名。若设置为“.lwx.com”,那么在这个域的服务器都可使用,如www.lwx.com和www.2008.lwx.com都可以使用;
Expires(期限):获得或设置cookie的终止日期和时间,你可以将其设置为一个过去的日期以自动终止或者删除cookie。(已经过时的属性,被max-age取代)
max-age:cookie生命期属性(使用秒为单位);
Names(名称):获得或设置cookie名称。
Path(路径):获得或设置cookie的虚拟路径。这一属性允许你限制cookie范围,也就是说,访问cookie只能限制于一个特定的文件夹或者路径。设置这一属性限制为只能访问特定
路径和该路径下的所有文件。设置为“/”对于网页所在服务器上的网页可见。
Secure(安全):安全属性。发信号以表示是否使用Secure Sockets Layer (SSL)来发送cookie值。默认情况下是不安全的,设置为安全,cookie只能在浏览器和服务器通过
HTTPS或其他安全协议链接时进行传输;
Value(值):获得或设置一个单独的cookie值。
Values(信息):返回包含在cookie中的key/value的一个集合。
注意:cookie的属性可以设置,但是无法读取,要修改只能把整个cookie读取出来,重新设置这些属性然后在添加!
用户系统上的Cookie由浏览器负责管理。Cookie 通过 HttpResponse 对象发送到浏览器,该对象公开称为 Cookies的集合。
Cookies的写入(Response)和读取(Request):
第一种:直接设置值
写入Cookies: Response.cookies("UserName")=Value ;//名、值对
设置Cookies的时间: Response.cookies("Name").Expires = date+1,表示Cookies保存1天 / Hour+8,表示Cookies保存8小时。
第二种:创建对象实例,通过Add方法添加
HttpCookie aCookie = new HttpCookie("lastVisit");
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
此时,Cookies集合中写入了两个Cookie,一个名为UserName,另一个名为lastVisit。
读取Cookies:
string UserName=Request.Cookies("UserName");
带子键的Cookies写入:
一个Cookies,允许有多个名、值对,在一个 Cookie 中存储多个名称/值对。名称/值对称为子键相关或类似的信息放在一个 Cookie 中很方便,由于所有信息都在一个 Cookie 中,所以有效期之类的 Cookie 属性就适用于所有信息。(注意,如果要为不同类型的信息指定不同的到期日期,就应该把信息存储在单独的 Cookie 中。)这样就节省了Cookies的使用个数限制。 设置一个名为userInfo的Cookie,含有两个子键userName,lastVisit
第一种:直接设置值
Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
第二种:创建实例,Add添加
HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
设置Cookies的控制范围:
通过path属性 设置Cookies的控制范围,一般一个站点中的每个页面都能获得该站点的所有 Cookie,如果要限制页面访问Cookies,通过两种方式设置 Cookie 的范围:
将 Cookie 限制到某个文件夹或应用程序:
HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
appCookie.Path = "/Application1"; //效果是 Cookie 只能用于Application1 文件夹或虚拟根目录中的页面来访问。
Response.Cookies.Add(appCookie);
设置Cookies的域范围:
通过Domain属性设置Cookies的域范围
Cookie 与特定域关联。例如,如果站点是 www.contoso.com,那么当用户向该站点请求任何页时,您编写的Cookie 就会被发送到服务器。(这可能不包括带有特定路径值的Cookie。)如果站点具有子域(例如,contoso.com、sales.contoso.com 和 support.contoso.com),则可以将 Cookie 与特定的子域关联。若要执行此操作,请设置 Cookie 的 Domain 属性:
Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "support.contoso.com"; //Cookie 将仅可用于指定的子域中的页面
如果:Response.Cookies["domain"].Domain = "contoso.com";//此时Cookies将被多个子域共享,sales.contoso.com 和 support.contoso.com都可以访问
读取Cookie并显示在页面的方法
if(Request.Cookies["userName"] != null) //确保该 Cookie 存在
Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);
或 if(Request.Cookies["userName"] != null)
{
HttpCookie aCookie = Request.Cookies["userName"];
Label1.Text = Server.HtmlEncode(aCookie.Value);
}
获取子键值的一种方法:
if(Request.Cookies["userInfo"] != null)
{
Label1.Text = Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);
Label2.Text = Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
}
获取单个子键的另一种方法是获取子键集合,然后再按名称提取子键值:
if(Request.Cookies["userInfo"] != null)
{
//Cookie 中的子键被类型化为 NameValueCollection 子键类型的集合
System.Collections.Specialized.NameValueCollection UserInfoCookieCollection ;
UserInfoCookieCollection = Request.Cookies["userInfo"].Values; //获取子键集合
Label1.Text = Server.HtmlEncode(UserInfoCookieCollection["userName"]); //获取子键集合中的单个子键值
Label2.Text = Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);
}
读取 Cookie 集合
有时,可能需要读取可供页面使用的所有 Cookie。
HttpCookie aCookie; string str;
for(int i=0; i<Request.Cookies.Count; i++)
{
aCookie = Request.Cookies[i];
str+= "Cookie name = " + Server.HtmlEncode(aCookie.Name) + "<br />";
str+="Cookie value = " + Server.HtmlEncode(aCookie.Value) + "<br /><br />";
}
Label1.Text = str;
读取带子键的Cookie集合
如果 Cookie 有子键,则会以一个名称/值字符串来显示子键。可以读取 Cookie 的 HasKeys 属性,以确定 Cookie 是否有子键。如果有,则可以读取子键集合以获取各个子键名称和值。可以通过索引值直接从 Values 集合中读取子键值。相应的子键名称可在 Values 集合的 AllKeys 成员中获得,该成员将返回一个字符串数组。
HttpCookie aCookie;
for(int i=0; i<Request.Cookies.Count; i++)
{
aCookie = Request.Cookies[i];
output.Append("Name = " + aCookie.Name + "<br />");
if(aCookie.HasKeys) //确定Cookie是否有子键
{
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 //无子键则输出该Cookie的值 (名--值对)
{
output.Append("Value = " + Server.HtmlEncode(aCookie.Value) + "<br /><br />");
}
}
Label1.Text = output.ToString();
或者,可将子键作为 NameValueCollection 对象提取 (子键集合)
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
{ 无子键时,输出value}}
修改和删除 Cookie
修改 Cookie
不能直接修改 Cookie。更改 Cookie 的过程涉及创建一个具有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie。下面更改存储用户对站点的访问次数的 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(); //创建一个具有新值的同名Cookie
Response.Cookies["counter"].Expires = DateTime.Now.AddDays(1);
删除 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.Values 子键集合移除单个子键
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);