在新技术大军横空出世年代,  Cookie 似乎已被遗忘. 但网页设计中依然少不了它的身影, 这里就本人多年对它的应用做以总结, 可能不是最全面的, 但一定是最实用的.

Cookie早 已不是不可替代, 不是必不可少, 也因此失去了很多色彩, 很多人把它形容为一鸡肋,食之无味, 弃之可惜. 但若都以此评判, 似乎我们很多技术都很 无味,  而似乎都不可缺少. 以我看来, 技术最好少做对比, 选择多了, 困惑也就多了, 心不静, 看什么都是有用而无味. 我却觉得很多技术自己 用的得心应手了自然就有了味道.

总结大家对 Cookie "食之无味" 大概有以下几个原因.

(1). 不安全, 这是最直接的一个原因, 因为 Cookie 是保存在客户端计算机上的, 因此很容易被修改, 从而导致访问服务器时应用程序的执行失败或者其他安全问题.

(2). 严重限制传送内容的大小, 这是最实现的一个原因, 大多数浏览器都限制 Cookie 的大小, 一般情况下都不能超过 4096 个字节, 因此传送的内容有限.

(3). 用户可控制 Cookie 的开启与停用: 这是最无奈的一个原因, 当用户设置其浏览器停止接收 Cookie时, 如此, 它便失去了作用.

(4). .......

虽已为鸡肋,但弃之总会可惜, 原因也无非下列几个原由.

(1). 使用简单: 因为使用太简单了, 所以它能活至今日, 虽有不少人一边天天抱怨, 一边却又偷偷地用它. Cookie 的简单是源于它是最简单的 索引键值 的文本结构, 读取与设置数据非常方便.

(2). 不占用任何服务器资源: Cookie 的生成原理是由服务器创建后随网页一起输入到客户端, 并且在驻留在客户端计算机上, 因此不需要占用服务器的任何资源.

(3). 有效期限可随意设置: 随心所欲地设置有效期限使它相当好用, 可以设置当浏览器结束访问时, Cookie 随之消失, 或者设置某个特点的到期时间, 甚至是永久保存在计算机上.

(4). .......

OK, 是福是祸, 人各有志, 暂且放下不谈. 这里我总结出了 Cookie 在网页设计中各个方面所起的作用和使用方法. 还是那句话, 可能不是最全的, 但一定是最实用的. 与大家分享. 好, 这里就从最简单的使用开始.

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 对象的内容值显示出来. 代码如下:

遍历Cookie集合[] 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 变量也会随之消失.

这里演示几种设定有效期的方法.

设置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;

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方法. 相关代码正下:

删除多值Cookie中的某个值 (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到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地址从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 实现自动登录

一般网站都会提供自动登录服务, 简单的说就是你第一次(或某一次)登录成功后在某个时间段内不需要再输入用户名或密码进行登录.

这很网站会提供给用户一个选择时间段的服务. 下面这个演示示例中, 用户可以在两个星期内, 登录时不再要求输入密码.

代码如下:

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

实现同11中的自动登录原理类似, 此处略.

转载于:https://www.cnblogs.com/dengxxdd/archive/2008/09/22/1295721.html

宝刀不老: Cookie (转)相关推荐

  1. [知识库分享系列] 二、.NET(ASP.NET)

    最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...

  2. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  3. cookie 免密登录_python

    我们都知道 HTTP 是无状态的,用户每次打开 web 页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么服务器是怎么识别用户的呢? 这就是本文今天要讲解的内容.当服务端需要 ...

  4. 你想了解的Cookie和Session就在这~

    目录 1.会话的概念 2.保存会话的两种技术 3.Cookie 4.Session(重点) 1.会话的概念 我们知道session的意思就是会话,Cookie和Session 是两种会话技术,我们首先 ...

  5. Cookie和Session的区别与联系

    Cookie和Session Session 会话的理解 Session的作用 HTTP协议的无状态特点 Session的实现原理(重点) Session常用方法: Cookie 基本介绍 经典案例 ...

  6. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...

    JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...

  7. cookie用法之一,最简单cookie操作

    一.先引用封装好的JS<script src="https://img.huiyiguanjia.com/cdnfile/public/publicfunction.js"& ...

  8. redis缓存和cookie实现Session共享

    分布式项目中要实现单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com.c.com)都认 ...

  9. 关于cookie与本地 存储的区别的问题。

    1. cookie在浏览器和服务器间来回传递.而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存. 2. cookie数据还有路径(path)的概念,可以限 ...

  10. 不同级域名中的 Cookie 共享

    HTTP 响应头中 Set-Cookie 行未指定 domain 时则设置访问的域名 seliote.com 可以设置 seliote.com(也可以写成 .seliote.com 意思一样) 与 w ...

最新文章

  1. Android StageFrightMediaScanner源码解析
  2. 统计与机器学习的异同
  3. [mybatis]全局配置文件标签顺序
  4. 【C++基础】自定义异常类与多重捕获
  5. matlab 8.4,《DSP using MATLAB》Problem 8.42
  6. 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)
  7. [短评]企业裁员行为对整个社会的正面意义
  8. 微软Azure云服务故障超过24小时,原因竟是——被雷劈了
  9. 2023年厦门大学全日制会计专硕(MPAcc)考研上岸前辈备考经验
  10. 前端商城项目实战-(前端篇)
  11. 电子购物网站导航制作
  12. Android Scheme协议与应用全解析
  13. 自制家谱制作软件怎么注册
  14. 【工具】(一):关于Sublime Text 3,主题插件Boxy Theme安装问题,已解决
  15. 美国2012年总统候选人政治献金数据分析
  16. Hinton最新演讲!一种新神经网络:前向-前向FF算法,论文已公开!
  17. arm芯片 安装linux,linux操作系统 arm
  18. 最大流——最大传输量
  19. 过滤器Filter(非常非常重要)
  20. 使用centos7+bind9构建内网私有dns

热门文章

  1. 如何在macOS下调整磁盘分区大小
  2. 在spring boot中3分钟上手RPC框架Dubbo
  3. 中国云计算进入全球通时代 阿里云四大海外数据中心相继开服
  4. Web移动开发基本概念
  5. jQuery实现输入框聚焦,键盘上下键选择城市
  6. DataBase 之 常用操作
  7. 100万并发连接服务器笔记之Java Netty处理1M连接会怎么样
  8. zabbix client安装配置执行
  9. Enterprise Library 1.0
  10. 5月8号--华为正式推出新企业标识