cookie

Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。

内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

<pre name="code" class="csharp">1. Cookie 可以存储哪些值
在 Cookie 中只能存储个人可识别信息. 个人可识别信息是指可以用来识别或联系用户的信息. 例如用户的姓名, 电子邮件, 家庭住址等. 必须强调的是, 这些可识别信息必须是非机密或重要信息.

2. 使用 Cookie 对象保存和读取客户端信息.
要存储一个 Cookie 变量, 可以通过 Response 对象的 Cookie 集合, 语法如下:
Response.Cookies[varName].Value=值;

其中, varName 为变量名.
要取回 Cookie, 可以使用 Request 对象的 Cookie 集合, 并将指定的 Cookie 集合返回, 语法如下 :
变量名=Request.Cookies[varName].Value;
以例为例: 用 Cookie 操作客户端 IP. 代码如下:

//保存客户端信息
string UserIP = Request.UserHostAddress.ToString();//获取客户端的IP地址
Response.Cookies["IP"].Value = UserIP;//将客户端的IP地址保存在Cookies对象中
Response.Cookies["IP"].Expires = DateTime.MaxValue;//设计Cookies的失效期

//读取
Response.Write(Request.Cookies["IP"].Value);//从Cookies中读取客户端IP地址值


3. 加密 Cookie 中的数据
为了避免用户信息被他人窃取, 增强网站的安全性, 通常需要对 Cookie 中的数据进行加密, 加密代码如下:

string data = "对Cookie中的数据加密。";
Response.Cookies["data"].Value = FormsAuthentication.HashPasswordForStoringInConfigFile(data, "md5");
Response.Write(Request.Cookies["data"].Value);


4. 使用 Cookie 对象在页面之间传值.
使用 Cookie 对象在页面之间传值与使用 Session 对象在页面之间传值的方法一样, 但两者有本质区别. 即Cookie 是存放在客户端的, 而 Session 是存放在服务器端的. Cookie 在使用时, 还需要配合 Asp.net 内置对象 Request.
使用 Cookie 对象传送信息的代码如下:

if (txtName.Text == "A" && txtPassword.Text == "a")
{
HttpCookie newCookie = new HttpCookie("UserName");
newCookie.Value = txtName.Text.Trim();
Response.AppendCookie(newCookie);
Server.Transfer("B.aspx");
}
else
{
Response.Write("<script>alert('登录失败!');</script>");
}


在 目标页面 (B.aspx)中, 接收 Cookie 对象传来的值, 并将其显示在界面上, 代码如下:

Label1.Text = Request.Cookies["UserName"].Value.ToString();

5. 使用 Cookie 验证用户登录.
使用 Cookie 来验证用户登录, 首先需要将登录信息保存在 Cookie 对象中, 然后读取并验证.
以例为例, 当用户注册时 ( 当然很多情况下也可以是用户退出系统 ), 将用户和用户密码保存在 Cookie 对象中, 代码如下:

Response.Cookies["SavedLogin"]["UserName"] =txtName.Text.Trim();
Response.Cookies["SavedLogin"]["UserPwd"] = txtPassword.Text.Trim();
Response.Cookies["SavedLogin"].Expires = DateTime.Now.AddDays(1);
Response.Write("<script>alert('注册成功!');location='Default.aspx';</script>");

而当用户登录时, 首先判断 Cookie 对象是否失效, 如果没有失效, 则判断用户输入的信息与 Cookie 对象中保存的信息是否一致, 如果一致, 就进行其他操作. 代码如下:


if (Request.Cookies["SavedLogin"] == null)
{
Response.Write("<script>alert('Cookie 失效!');location='Default.aspx';</script>");

}
else
{
if (txtName.Text == Request.Cookies["SavedLogin"]
["UserName"].ToString() && txtPassword.Text ==
Request.Cookies["SavedLogin"]["UserPwd"].ToString())
{
Session["UserName"] = txtName.Text.Trim();
Response.Redirect("NavigatePage.aspx");
}
else
{
Response.Write("<script>alert('登录失败!')");
}
}

6. 创建及存取多个键值的 Cookie 对象.
多键值的应用其实是一种 "分类" 思想, 把某一类信息存储在一起. 实现方法是
使用 Response 对象可以创建多个数据值的 Cookie, 语法如下:
Response.Cookies["CookieName"]["KeyName"]="Cookie中相对索引键的值";
例如, 使用多键值保存用户名与密码. 代码如下:


if (txtName.Text == "A" && txtPassword.Text == "a")
{
Response.Cookies["UserInfo"]["UserName"] = this.txtName.Text.Trim();
Response.Cookies["UserInfo"]["UserPwd"] = this.txtPassword.Text.Trim();
Response.Redirect("B.aspx");


}
else
{
Response.Write("<script>alert('登录失败!');</script>");
}

当发出网页请求时, 浏览器会将 Cookie 信息发送到服务器. 在服务器端, 可以使用 Request 对象来存取 Cookie中的数据值. 语法格式有以下3种形式.
方法一: 直接取出数据值
stirng str1=Response.Cookies["CookieName"]["KeyName"];
方法二: 利用索引来取出数据值
string str2=Response.Cookies["CookieName"].Values[1];
方法三: 利用索引键名来取出数据值.
string str3=Response.Cookies["CookieName"].Values["KeyName"];

7. 遍历 Cookie 集合
此处以实例演示说明: 如何遍历客户端的 Cookie 对象, 并将客户端的所有 Cookie 对象的内容值显示出来. 代码如下:

string[] cookieName, keyName;//定义两个数组,用来存放名称
HttpCookieCollection myCookieCollection;//定义Cookies集合对象
HttpCookie myCookie;//定义Cookie对象
myCookieCollection = Request.Cookies;//将客户端的Cookie取出
cookieName = myCookieCollection.AllKeys;//取得集合中所有的Cookie名称
for (int i=0; i <= cookieName.GetUpperBound(0); i++)//对每个Cookie进行循环
{
myCookie =myCookieCollection[cookieName[i]];
Response.Write("该Cookie的名称:"+myCookie.Name +"<br>"+"该Cookie的到期时间:"+myCookie.Expires+"<br>");
Response.Write("该Cookie中所有的内容值如下所示:"+"<br>");//输出Cookie内容
keyName = myCookie.Values.AllKeys;
for (int j = 0; j <= keyName.GetUpperBound(0); j++)
{
Response.Write(keyName[j]+":"+myCookie[keyName[j]]+"<br>");
}
Response.Write("<hr>");


8. 设置 Cookie 变量的的生命周期
虽然 Cookie 对象变量是存放在客户端计算机上, 但是也不是永远不会消失. 设计人员在程序中设定 Cookie 对象的有效日期, 语法如下:
Response.Cookies["CookieName"].Expires=日期;

如果没有指定效期 ( Expires 属性), Cookie 变量将不会被保存. 当关闭浏览器时, Cookie 变量也会随之消失.
这里演示几种设定有效期的方法.

//20分钟后到期
TimeSpan ts=new TimeSpan(0, 0, 20, 0);
Response.Cookies["myCookie"].Expires=DateTime.Now.Add(ts);

//一个月后到期
Response.Cookie["myCookie"].Expires=DateTime.Now.AddMouths(1);

//指定具体有效日期
Response.Cookies["myCookie"].Expires=DateTime.Parse("2010-10-1");
//永远不过期
Response.Cookies["myCookie"].Expires=DateTime.MaxValue;

//关闭浏览器后过期
Response.Cookies["myCookie"].Expires=DateTime.MinValue;


<pre name="code" class="csharp">9. 删除客户端的 Cookie.
删除客户端的 Cookie 主要是设置指定 Cookies 的有效期, 有以下两种方式.
方法一: 将指定 Cookie 的有效期设置为过去的某个时间. 例如, 设置 Cookie 有效期为当前系统时间的前一天, 代码如下:
Response.Cookies["myCookie"].Expires=DateTime.Now.AddDays(-1);



方法二: 将指定 Cookie 的有效期设置为最小值 ( MinValue). 当浏览器关闭时, 相关 Cookies 失效. 代码如下:
Response.Cookies["myCookie"].Expires=DateTime.MinValue;



10. 删除多值 Cookie 中的某个值.
使用 Remove方法. 相关代码正下:

if (txtval1.Text != "" && txtval2.Text != "")
{
HttpCookie hc = Request.Cookies["Val"];
hc.Values.Remove("val2");
Response.Cookies.Add(hc);
}
else
{
Response.Write("请先输入变量值!");

}

11. 使用 Cookie 防止网上重复投票
Cookie提供了一种在 Web 应用程序中存储用户特定信息的方法. 例如, 当用户第一次浏览 Web 站点时, Cookie将会记下用户登录 IP地址, 在Cookie 的有效期内, 当该用户再次发出浏览此 Web 站点中页面的请示时, 浏览器就会和服务器交换 Cookie信息, 识别该用户的身份.
这里制作一个简单的程序. 使用 Cookie 的这个特性防止重复投票.
实现方法是, 将客户端的 IP 地址保存在 Cookie 对象中, 主要代码如下:

//判断指定的IP是否已投过票了,如果已经投过了,则弹出提示对话框
string UserIP = Request.UserHostAddress.ToString();
int VoteID = Convert.ToInt32(RadioButtonList1.SelectedIndex.ToString())+1;
//获取名为userIP的Cookie对象
HttpCookie oldCookie=Request.Cookies["userIP"];
//判断该Cookie对象是否存在
if (oldCookie == null)
{
UpdateVote(VoteID);
Response.Write("<script>alert('投票成功,谢谢您的参与!')</script>");
//定义新的Cookie对象
HttpCookie newCookie = new HttpCookie("userIP");
newCookie.Expires = DateTime.MinValue;
//添加新的Cookie变量IPaddress,值为UserIP
newCookie.Values.Add("IPaddress", UserIP);
//将变量写入Cookie文件中
Response.AppendCookie(newCookie);
return;
}


然后从Cookie中获取客户端的IP地址并判断该IP地址是否已访问过网站, 如果已访问过, 则弹出提示框, 提示用户, 主要代码如下:

//从Cookie中获取客户端IP地址
string userIP = oldCookie.Values["IPaddress"];
if (UserIP.Trim() == userIP.Trim())
{
Response.Write("<script>alert('一个IP地址只能投一次票,谢谢您的参与!');history.go(-1);</script>");
return;

}
else
{
//创建 HttpCookie 类型的对象并为它分配名称为userID
HttpCookie newCookie = new HttpCookie("userIP");
//为 Cookie 的子项赋值,即将客户端IP地址赋给Cookie的子项,并将其命名为IPaddress
newCookie.Values.Add("IPaddress", UserIP);
//设置所有 Cookie失效期
newCookie.Expires = DateTime.MinValue;
//将该 Cookie 添加到 Cookies 集合中
Response.Cookies.Add(newCookie);
//Response.AppendCookie(newCookie);
UpdateVote(VoteID);
Response.Write("<script>alert('投票成功,谢谢您的参与!')</script>");
return;
}


12. 使用 Cookie 实现自动登录
一般网站都会提供自动登录服务, 简单的说就是你第一次(或某一次)登录成功后在某个时间段内不需要再输入用户名或密码进行登录.
这很网站会提供给用户一个选择时间段的服务. 下面这个演示示例中, 用户可以在两个星期内, 登录时不再要求输入密码.
代码如下:

if (Request.Cookies["UserName"] != null)
{
Response.Redirect("B.aspx?UserName=" + Request.Cookies["UserName"].Value);
}
else
{
if(this.txtName.Text=="A"&&this.txtPassword.Text=="a")
{
if (CheckBox1.Checked == true)
{
Response.Cookies["UserName"].Value = System.Web.HttpUtility.UrlEncode(txtName.Text);
Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(14);
}
Response.Redirect("B.aspx?UserName=" + System.Web.HttpUtility.UrlEncode(txtName.Text));

}
else
{
Response.Write("<script>alert('输入出错!')</script>");
}
}

13. 使用 Cookie 实现单点登录
单点登录( Single Sign On, SSO)是目前比较流行的企业业务整合的解决方案之一. 简单的说, 就是每个客户端对每个网站同时只能打开一个. 这样最大的好处是可以缓解服务器的压力. 一般在企业网站中较为常见. 因为门户网站, 社区博客等希望你打开的越多越好, 不会设置单点登录.
实现同12中的自动登录原理类似, 此处略.







评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值