ASP.NET Cookie对象到底是毛啊?(简单小例子)

简介:

记得刚接触asp.net的时候,就被几个概念搞的头痛不已,比如Request,Response,Session和Cookie。然后还各种在搜索引擎搜,各种问同事的,但是结果就是自己还是很懵的节奏。

那cookie到底是毛啊?下面是我最不喜欢的一种解释方式(官方定义吧应该叫,我这种智商根本读不懂嘛~)

Cookie对象也称缓存对象,该对象用于保存客户端浏览器请求的服务器页面,也可用它存放非敏感性的用户信息。

以前根本读不懂啊,现在其实也懵懵的。

还是用例子能把这个概念搞明白

1、做一个用户登录的界面,用cookies保存登录信息的功能。如图:

wKioL1PIgVDiZ7M0AAAznAJrRow609.jpg

后台代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
         protected  void  Page_Load( object  sender, EventArgs e)
         {
             if  (Request.Cookies[ "password" ] !=  null )
             {
                 if  (DateTime.Now.CompareTo(Request.Cookies[ "password" ].Expires) > 0)
                 {
                     textbox_password.Text = Request.Cookies[ "password" ].Value;
                 }
             }
         }
         protected  void  button_login_Click( object  sender, EventArgs e)
         {
             if  (checkbox_remember.Checked)
             {
                 HttpCookie cookie_password =  new  HttpCookie( "password" );
                 cookie_password.Value = textbox_password.Text;
                 Response.Cookies.Add(cookie_password);
 
                 DateTime dtNow = DateTime.Now;
                 TimeSpan ts =  new  TimeSpan(0, 0, 0, 10); //这里是将cookie的有效期设置成10s
                 cookie_password.Expires = dtNow.Add(ts);
            
         }

这个例子很简单,思路就是选择记住密码的checkbox,就创建一个cookie用于记录密码的内容,同时设置有效期。当下次加载的时候,判断有没有这个“密码”cookie,有的话判断这个cookie是否过期,若未过期,就将这个cookie里存的值取出来,放到对应的文本框中。

这里把有效期设置为10s的原因是为了让大家看到的效果明显些。大家只要不断的去刷新页面,就会发现在10s之前,密码部分还是一直有值,过了10s,就自动清空了。这就是因为cookie到期。

2、一个统计当前IP登录页面次数的功能。界面如图:

wKioL1PIgWLAUzWjAAAh4AF19Fs979.jpg

其实还是这个例子比较有意思,界面很简单,但是问题稍多。

后台代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
         string  ipAddress =  string .Empty;
         protected  void  Page_Load( object  sender, EventArgs e)
         {
             ipAddress = Dns.GetHostByName(Server.MachineName.ToString()).AddressList[0].ToString();
             if  (!IsPostBack)
             {
                 if  (Request.Cookies.AllKeys.Contains(ipAddress))
                 {
                     //Request.Cookies[ipAddress].Value = (Convert.ToInt32(Request.Cookies[ipAddress].Value) + 1).ToString();@@@
                     HttpCookie cookie_ip =  new  HttpCookie(ipAddress);
                     cookie_ip.Value = (Convert.ToInt32(Request.Cookies[ipAddress].Value) + 1).ToString();
                     Response.Cookies.Set(cookie_ip);
                 }
                 else
                 {
                     HttpCookie cookie_ip =  new  HttpCookie(ipAddress);    
                     cookie_ip.Value =  "1" ;
                     Response.Cookies.Add(cookie_ip);
                     DateTime dtNow = DateTime.Now;
                     TimeSpan ts =  new  TimeSpan(0, 0, 0, 20);
                     cookie_ip.Expires = dtNow.Add(ts);
                 }
             }
         }
         protected  void  button_statistics_Click( object  sender, EventArgs e)
         {
             if  (Request.Cookies[ipAddress] !=  null )
             {
                 textbox_count.Text = Request.Cookies[ipAddress].Value;
             }
             else
             {
                 textbox_count.Text =  "0" ;
             }
         }
 
         protected  void  button_clear_Click( object  sender, EventArgs e)
         {
             HttpCookie cookie_ip =  new  HttpCookie(ipAddress);
             cookie_ip.Expires = DateTime.Now.AddDays(-1);
             Response.Cookies.Set(cookie_ip);
             Request.Cookies.Remove(ipAddress);
             Request.Cookies.Clear();
         }

这个小例子的思路就是,先获得本地的IP地址,这就保证了添加Cookie的时候,给Cookie了一个独一无二的key。在刷新页面的时候,去判断当前所有Cookie中是否存在一个同名的cookie。如果不存在,就新建一个cookie,当然,此cookie的key=IP地址。就是Page_Load里else的部分。如果存在,那么就在原来的值的基础上加1。这里要注意修改已存在Cookie值的写法。

最开始的时候我用的是注释掉的@@@这行代码,就是正常思路,看着也没什么问题呀,不过这样写不行,第一次加载之后的每次加载,取到的Request.Cookies[ipAddress].Value这个值总是1。所以对于修改已有的cookie值,还是需要使用cookies的set方法才行。

此外还有一个地方是需要注意的,就是删除cookie的时候,如果直接使用Cookies.Remove或者Cookies.Clear()方法都达不到想要的效果。需要配合的加上Expires,给一个负值。然后去更新Cookie,再删除,这样这个cookie就彻底消失了。否则在下次加载的时候又会出现,这个还真不知道是为什么?我之前就写了一句Request.Cookies.Clear(),打断点跟的时候,所有的cookie确实都清空了,但是当再次加载的时候,在添加cookie前打了断点,会发现之前删除的cookie又出现了。很奇怪啊~~

希望明白的朋友告诉一声怎么回事哈。

两个简单的小例子让自己对cookie不再感觉那么陌生和害怕了。所以光看概念还是效果一般,动手才是王道呀~










本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1439810,如需转载请自行联系原作者

目录
相关文章
|
6月前
|
存储 开发框架 NoSQL
ASP.NET WEB——项目中Cookie与Session的用法
ASP.NET WEB——项目中Cookie与Session的用法
88 0
|
6月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
162 0
|
6月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
88 0
|
存储 开发框架 前端开发
asp.net与asp.net优缺点及示例
asp.net与asp.net优缺点及示例
|
3月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
4月前
|
开发框架 JSON 前端开发
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
|
3月前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
5月前
|
开发框架 .NET API
ASP.NET Core Web中使用AutoMapper进行对象映射
ASP.NET Core Web中使用AutoMapper进行对象映射
|
6月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
|
6月前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
83 0