ASP.NET内置对象之Session ,Cookie ,Application

 注:本文主要是参考《ASP.NET 夜话》,加入了自己的整理

做asp.net开发时无需new就能使用的对象,如:

  Request ,Response ,Server ,Session ,Cookie ,Application
在asp.net中所有的网页都是继承自System.Web.UI.Page这个类。由于HTTP是一种无状态的协议,也就是它并不记得上一次谁请求过它,不会主动去询问客户端,只有当客户端主动请求之后,服务器才会响应。

前面我们提到,在HTTP中,服务器与客户端并不是时时保持连接状态,而是服务器被动地等待客户发送请求,服务器才进行响应。因此,在大部分情况下,服务器并不会管客户端是否还依然存在。 在这种情况下,假如用户通过访问一些需要权限的页面,在他输入正确的用户名和密码之后第一次他访问a页面,隔几分钟之后再访问同样需要权限才能访问的b页面,这是他还需要输入用户名和密码吗?按照道理来说如果这个时间间隔比较短,我们不应该要求频繁用户输入这些信息,可是服务器又不记录这些信息,我们有没有办法解决这
个问题呢? 答案是有的,就是利用Session或者Cookie。
4、Session对象
Session对象用来保存与特定用户相关的信息,Session中的数据保存在服务器端,在客户端需要的时候创建Session,在客户端不需要的时候销毁Session,使它不再占用服务器内存。前面说了服务器并不管客户端是否依然存在,因而它也无法确定客户端什么时间不再使用它,但是如果在客户端不再用的时候不及时销毁Session的话,服务器很快就会内存不足。为了解决这个问题,给Session加了一个生命周期,当服务器发现Session超过了它的生命周期,就会释放该Session所占用的内存空间。在asp.net中Session的默认生命周期是20分钟,也就是当我们在9:00的时候设置了一个Session,如果在9:20之前客户端没有任何请求,那么它的生命周期就到9:20分钟结束。但是一旦用户在9:19又向服务器发送了一个请求,那么这个Session现在的生命周期就是在当前时间的基础上再加上20分钟,也就是此时这个Session的生命周期是到9:39结束。
Session具有以下特点:
(1)数据保存在服务器端;
(2)可以保存任意类型的数据;
(3)Session默认的生命周期是20分钟,可以手动设置更长或更短的时间。
假设我们要设置一个Session用来保存用户名,这个Session的名字是“UserName”,值是“zhoufoxcn”,代码如下:

Session[“UserName”] = ”zhoufoxcn”;

 一个网站里用到Session的地方肯定不止一个,所以在设置和获取Session的时候通过Session的名在来操作,并且Session被设置成能存储任意类型的对象(即Object类型),所以获取Session的时候要根据设置的时候的实际类型进行响应的强制类型转换(当然如果在Session中存放像int/byte/short这样的数据类型,获取Session的值算是一种拆箱操作而不是强制类型转换),对于上面的Session,获取Session的值的代码如下:

string  username = ( string )Session[“UserName”];

对于上面的代码,有个问题需要注意:当没有设置相应的Session或者Session因为超过生命周期而被销毁时,上面的代码有可能抛出异常。我们可以先判断是否存在指定名称的Session,如果不存在就不用获取了,仅当存在的情况下才获取Session的值,上面的代码可以改进如下:

  string  username = ( string )Session[“UserName”];
 
string  userName; 
 
if (Session[ " UserName " ] != null
 { 
     
// 当指定名称的Session存在时,获取指定Session的值 
      userName = ( string )Session[ " UserName " ]; 
 }


5、Cookie对象

Cookie对象和Session对象一样也是用来保存特定的用户相关的数据,与Session不同的是Cookie保存在客户端而不是服务器上,每次客户端发出请求的时候都会把Cookie一起发送到服务器,服务器每次响应客户端请求的时候会重新把Cookie发送到客户端保存。
Cookie保存数据有以下特点:
(1)数据保存在客户端;
(2)只能保存字符串类型的数据,如果需要在Cookie中保存其它类型数据,需要将其转换成字符串类型后保存;
(3)Cookie也有其默认生命周期,也可以手动设置,最大可设置成50年之后过期。

会话cookie和持久cookie的区别
  如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。


同Session的情况一样,有可能在一个网站中使用到的Cookie不止一个,我们仍通过Cookie的名称来区分不同的Cookie。 设置Cookie的过程就是在服务器的响应对象Response的Cookie集合中增加一个Cookie的实例,Response对象会把这个Cookie集合中的所有Cookie都发送客户端。代码如下(仍以保存用户名为例):

HttpCookie cookie  =   new  HttpCookie( " UserName " " zhoufoxcn " ); 
Response.Cookies.Add(cookie);

 获取Cookie就是从客户端的请求对象中找到对应名称的Cookie,当然也有可能出现Cookie不存在的情况,所以在获取之前也需要检查指定名称的Cookie是否存在,代码如下:

string  userName; 
  
if  (Request.Cookies[ " UserName " !=   null
  { 
       userName 
=  Request.Cookies[ " UserName " ].Value; 
  }

 Session和Cookie一般用来一些针对特定用户的信息,比如用于保存用户名等,因为是针对特定用户的,所以不会出现张三用户名保存在Session或者Cookie中之后再去获取这个值的时候得到的是李四的用户名。但是在某些情况下,我们又希望保存一些共有信息,这样大家都能设置或者获取,比如自从服务器启动以来某个页面被打开的次数,这就需要用Application了。
设置cookie的期限:

ExpandedBlockStart.gifcookie的期限
        HttpCookie cookie=Request.Cookies["name"];//获取客户端Cookie
        if (cookie == null)//如果不存在该名称的Cookie
        {
            cookie = new HttpCookie("name""zhoufoxcn"
);
            cookie.Expires = DateTime.Now.AddDays(10);//设置cookie保存10天

            Response.Cookies.Add(cookie);//将cookie发送到客户端保存
        }
        
else

        {
            Response.Write(
"cookie中保存的数据是:" +  cookie.Value);
            cookie.Expires = DateTime.Now.AddYears(-1);//设置cookie一年前过期

            Response.Cookies.Add(cookie);//将cookie发送到客户端,这样就能删除掉cookie
        }

6、Application对象
 Application和Session存储的数据类型和存储位置一样,都是存放Object类型的数据(也就是任意类型),并且存放在服务器上,不同的Application中的数据可以由网站中所有的用户来设置或者获取。并且Application中存放的数据没有时间限制,除非我们手动删除或者服务器重新启动,否则存放的数据都会丢失。
下面是Session、Cookie和Application的区别:

名称使用范围存储位置存放数据类型生命周期
Cookie特定用户客户端String,也就值字符串可以自行设置
Session特定用户服务器Object,也就是任意类型有,可以自行设置
Application所有用户服务器Object,也就是任意类型
下面我们以一个小例子来说明Session和Application的区别:(新建一个单文件的aspx页面,把代码复进去)
ExpandedBlockStart.gif Application与Session区别
<% @ Page Language = " C# "  ContentType = " text/html "  ResponseEncoding = " gb2312 "   %>  
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >  
< html  xmlns ="http://www.w3.org/1999/xhtml" >  
< head >  
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312"   />  
< title > Application和Session的例子 </ title >  
</ head >  
< body >  
<%  
// 如果没有设置名为 " ApplicationCount " 的Application 
int  applicationCount = 1
int  sessionCount = 1
f(Application[
" ApplicationCount " ] == null

    Application[
" ApplicationCount " ] = 1

else // 否则取出该Session,并且在当前值上加1 

    applicationCount
= ( int )Application[ " ApplicationCount " ] + 1
    Application[
" ApplicationCount " ] = applicationCount; 

// 如果Session[ " SessionCount " ]为空,即没有设置该名字的Session 
f(Session[
" SessionCount " ] == null

    Session[
" SessionCount " ] = 1

else  

    sessionCount
= ( int )Session[ " SessionCount " ] + 1
    Session[
" SessionCount " ] = sessionCount; 

    Response.Write(
" 当前页面由Application记录到的被访问了 " + applicationCount + " 次<br/> " ); 
    Response.Write(
" 当前页面由Session记录到的被访问了 " + sessionCount + " 次<br/> " ); 
%>  
</ body >  
</ html >

 结果如下(按刷新也是一样)


但当我们关闭浏览器后再看结果将会改变:


从上面可以看到,Application不变,而Session变了,因为有些浏览器会视同为同一个Session,导致出现不了预期的效果。通过上面的例子证明了Application确实是属于所有网站用户的,它适合保存全局的数据信息,如网站从Web服务器启动以来接受的请求个数或者当前在线总人数;而Session只与特定用户有关,只适合保存特定用户的信息,比如用户的用户名。

转载于:https://www.cnblogs.com/aito/archive/2010/08/07/1794730.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值