cookie

来源:互联网 发布:武汉鲨鱼网络直播 编辑:程序博客网 时间:2024/06/04 22:47
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,值为UserIPnewCookie.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 类型的对象并为它分配名称为userIDHttpCookie newCookie = new HttpCookie("userIP");//为 Cookie 的子项赋值,即将客户端IP地址赋给Cookie的子项,并将其命名为IPaddressnewCookie.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中的自动登录原理类似, 此处略.




0 0
原创粉丝点击