guthing

Application,Session,Cookie,ViewState,Cache的区别(转)

1.Application:用于保存所有用户共用的数据信息。

在Asp.Net中类似的配置数据最好保存在Web.config文件中。如果使用Application对象,一个需要考虑的问题是任何写操作都要在 Application_OnStart事件(global.asax)中完成。尽管使用Application.Lock和 Application.Unlock方法来避免写操作的同步,但是它串行化了Application对象的请求,当网站访问量大的时候会产生严重的性能 瓶颈。因此最好不要用此对象保存大的数据集。

使用如下:

//存放信息 Application["nameID"]="0001";

//读取信息 String NameID=Application["nameID"].ToString();

2.Session:用于保存每个用户的专用信息。

Session中的信息保存在Web服务器的内存中,保存的数据量可大可小。

当Session超时或被关闭时将自动释放保存的数据信息。对于小量的数据Session对象保存还是一个不错的选择。 使用如下:

//存放信息 Session["nameID"]="0001";

//读取信息 String NameID=Session["nameID"].ToString();

3.Cookie: 用于保存客户浏览器请求服务器页面的请求信息,其有效期可以人为设置,而且其存储的数据量很受限制,因此不要保存数据集及其他大量数据。而且Cookie以明文方式将数据信息保存在客户端的计算机中,因此最好不要保存敏感的未加密的数据。

使用如下:

//存放信息 Response.Cookie["nameID"].Value="0001";

//读取信息 String NameID=Response.Cookie["nameID"].Value;

4.ViewState: 常用于保存单个用户的状态信息,可以保存大量的数据但是过多使用会影响应用程序的性能。

所有Web服务器控件都使用ViewState在页面回发期间保存自己的状态信息。每个控件都有自己的ViewState,不用时最好关闭以节省资源。通过给@Page指令添加"EnableViewState= false"属性可以禁止整个页面的ViewState。 使用如下:

//存取信息 ViewState["nameID"]="0001";

//读取信息 string NameID=ViewState["nameID"].ToString();

5.Cache:用于在Http请求间保存页面和数据。

它允许将频繁访问的大量服务器资源存储在内存中,当用户发出相同的请求时服务器不再次处理而是将Cache中保存的信息返回给用户,节省了服务器处理请求时间。

使用如下: //存放信息 Cache["nameID"]="0001";

//存放信息 Cache.Insert("nameID","0001");

//读取信息 String NameID=Cache["nameID"].ToString();

注意: 如果利用缓存提供的清理、到期时间和依赖项等功能,必须使用Cache.Insert方法或Cache.Add方法添加信息。

6.隐藏域:Hidden控件属于Html类型的服务器控件,可以实现隐藏域的功能,他和其他的空间没什么区别只是不会在浏览器上显示,始终处于隐藏状态。

使用如下:

//存放信息 Hidden.Value="0001";

//读取信息 String NameID=Hidden.Value;

7.查询字符串:将传递的值连接在URL后面,然后通过Response.Redirect方法实现客户端的重定向。

传递方法如下:

Response.Redirect("List.aspx?nameID=0001&gradeID=002");

执行上面的语句后在IE地址栏显示的URL的代码如下:

http://www.QQview.com/List.aspx?nameID=0001&gradeID=002

当跳转到List.aspx后,可以通过下面代码获得传递的信息: String NameID,GradeID; NameID=Request.Params["nameID"];

GradeID=Request["gradeID"];

通过比较总结的每一种对象应用的具体环境: 方法 信息量大小 保存时间 应用范围 保存位置

Application 任意大小 整个应用程序的生命周期 所有用户 服务器段

Session 小量,简单的数据 用户活动时间+一般延迟时间(一般为20分钟) 单个用户 服务器段

Cookie 小量,简单的数据 可以根据需要设定 单个用户 客户端

Viewstate 小量,简单的数据 一个Web页面的生存周期 单个用户 客户端

Cache 任意大小 可以根据需要设定 所有用户 服务器段

隐藏域 小量,简单的数据 一个Web页面的生存周期 单个用户 客户端

查询字符串 小量,简单的数据 直到下次页面跳转请求 单个用户 客户端

web.config文件 不变或极少改变的小量数据 直到配置文件被更新 是可以存储针对与某一个用户的IE以及通过其当前窗口打开的任何窗口具有针对性的用户信息存储机制。          

先研究SESSION是如何启动的,当打开IE以后浏览网站后会发出一个指令请求SESSIONID以及对各个类型数据的下载许可,如图片,声音以及FLASH。      

数据实际传输内容:IE到服务器       GET   /   HTTP/1.1       Accept:   image/gif,   image/x-xbitmap,   image/jpeg,   image/pjpeg,   application/x-shockwave-flash,   */*       Accept-Language0:   zh-cn       Accept-Encoding:   gzip,   deflate       User-Agent:   Mozilla/4.0   (compatible;   MSIE   5.01;   Windows   NT   5.0)       Host:www.jh521.com       Connection:   Keep-Alive          

服务器会返回一个没有被使用的SESSIONID让IE使用,当时IE就对返回SESSIONID做存储并同时返回相关页面的下载数据,如下:

服务器到IE       HTTP/1.1   200   OK       Server:   Microsoft-IIS/5.0       Date:   Sun,   30   Nov   2003   16:41:51   GMT       Content-Length:   21174..Content-Type:   text/html       Set-Cookie:   ASPSESSIONIDCACBBBRT=IBOMFONAOJFEEBHBPIENJFFC;   path=/       Cache-control:   private      

然后就是页面HTML代码           此时这个IE程序(不是客户机)的SESSIONID就为IBOMFONAOJFEEBHBPIENJFFC         

而当IE在访问任何这个站点的ASP程序的时候,就会把IBOMFONAOJFEEBHBPIENJFFC发送给服务器,服务器就会知道IBOMFONAOJFEEBHBPIENJFFC是表示你       而在服务器上设置SESSION("name")="name"      

完全可以看成是      

SESSION("IBOMFONAOJFEEBHBPIENJFFC")("name")="name"      

或者       SESSION(SESSIONID)("name")="name"      

这样,SESSION就区分开用户了。      

而当服务器反馈这个ID的时候会看这个ID有没有被使用。如果有在换一个。反正不会让你重复,如果想模拟某人的SESSION的ID来进行欺骗是可以的。不过要获取到对方IE传输信号,并且在保证当时这个SESSIONID没有被取消的情况下才可能实施。不过要是有那时间不如直接通过POST信号找他NAME和PASS了。          

再看看COOKIE,有人说SESSIONID就是COOKIE,按照技术上来讲他们不属于同类          

但是属于一种工作模式,用户和服务器传输私有数据          

当设置COOKIE的时候,服务器会反馈给IE一个指令。IE通过这个网络指令生成COOKIE并存放,在访问这个站点并且COOKID有效的时候可以取得这个信息。          

COOKIE和SESSION的区别           有效时间以及存储方式   传输内容       COOKIE   可设置并在本地保留   明码信息       SESSION   在IE不关闭并服务器不超时   只有SESSIONID          

当如果想让用户下次登入网站不需要输入用户名或者密码的时候就只能用COOKIE,因为他可以保留相当长的时间(在COOKIE记录被删除或者失效日期之前)      

而SESSION就不可以,他不会保留太长时间,而且IE在关闭后就自动清除了SESSIONID记录     

在下次登入的时候会请求新的SESSIONID    而服务器想通过用户个人变量校验用户的状态的时候,就不能用COOKIE       如果用设置用户权限是USER。而IE访问的时候就把USER的明码传输到服务器。       那么如果我通过一定手段,比如直接修改COOKIE记录,把USER修改成ADMIN呢~~       就麻烦了。           但存储用户名和密码或者网站的配色方案这样的信息,用COOKIE是最好的          

此外,再说说Request.ServerVariables("HTTP_REFERER")          

有一些人通过这个Request.ServerVariables("HTTP_REFERER")       来进行一些关键性限制,特别是对付远程提交以及非法侵入。       那么我就要提醒下服务器取得的HTTP_REFERER信息完全是IE传输给服务器的,可以模拟 而且难度不大,用不到半个小时就可以用VB做出一个针对HTTP_REFERER入侵程序。          

网友的一个不错的比喻:      

COOKIE   是本地文件,是40大盗在阿里巴巴家做的记号,或者是送牛奶的人在你家门口钉的箱子。     

SESSION   是服务器端内存,是你洗澡时浴池发给你的钥匙。       自己专用,可以开自己的好多箱子。       APPLICATION   是公共浴池。       在这里能看见所有人,包括ppmm哦:)。

本文出处:http://blog.csdn.net/logicbiz/archive/2008/05/21/2466802.aspx

posted on 2009-10-27 10:22  wolfman  阅读(710)  评论(0编辑  收藏  举报

导航