6.4 技术解惑
6.4.1 对内置对象的总结
ASP.NET内置对象的工作流程如图6-13所示。
图6-13 内置对象的工作流程
6.4.2 Session对象和Cookie对象的比较
(1)应用场景
Cookie的典型应用场景是Remember Me服务,即用户的账户信息通过Cookie的形式保存在客户端,当用户再次请求匹配的URL的时候,账户信息会被传送到服务端,交由相应的程序完成自动登录等功能。当然也可以保存一些客户端信息,如页面布局以及搜索历史等。
Session的典型应用场景是用户登录某网站之后,将其登录信息存入Session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等经典场景。
(2)安全性
Cookie将信息保存在客户端,如果不进行加密,无疑会暴露一些隐私信息,安全性很差。一般情况下敏感信息是经过加密后存储在Cookie中,但很容易被窃取。而Session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比Cookie小了很多。
Session在全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于Cookie。
(3)性能
Cookie存储在客户端,消耗的是客户端的I/O和内存;而Session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而Cookie很好地分散了资源消耗,就这点来说,Cookie是优于Session的。
(4)时效性
Cookie可以通过设置有效期使其较长时间存在于客户端,而Session一般只有比较短的有效期(用户主动销毁Session或关闭浏览器后引发超时)。
6.4.3 Application对象和Session对象的区别
Application对象和Session对象的区别如表6-16所示。
表6-16 Application对象和Session对象的区别
对 象 |
信息量大小 |
保 存 时 间 |
应 用 范 围 |
保 存 位 置 |
---|---|---|---|---|
Application |
任意大小 |
整个应用程序的生命期 |
所有用户 |
服务器端 |
Session |
小量,简单的数据 |
用户活动时间+一段延迟时间(一般分为20分钟) |
单个用户 |
服务器端 |
Application用于保存所有用户的公共数据信息。如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成。虽然使用Application.Lock和Applicaiton.Unlock方法可以避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大时会产生严重的性能瓶颈,因此最好不要用此对象保存大的数据集合。
Session用于保存每个用户的专用信息,其生存期是用户持续请求时间再加上一段延长时间(一般为20分钟)。Session中的信息保存在Web服务器内容中,保存的数据量可大可小。当Session超时或被关闭时,将自动释放保存的数据信息。由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低。对于小量的数据,使用Session对象保存是一个不错的选择。
6.4.4 对Application、Session、Cookie、ViewState和Cache的选择
在ASP.NET中有很多种保存信息的对象,如Application、Session、Cookie、ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么?为了更清楚地了解,我们总结出每一种对象应用的具体环境,如表6-17所示。
表6-17 Application、Session、Cookie、ViewState和Cache的选择
方 法 |
信息量大小 |
保 存 时 间 |
应 用 范 围 |
保 存 位 置 |
---|---|---|---|---|
Application |
任意大小 |
整个应用程序的生命期 |
所有用户 |
服务器端 |
Session |
小量、简单的数据 |
用户活动时间+一段延迟时间(一般约为20分钟) |
单个用户 |
服务器端 |
Cookie |
小量、简单的数据 |
可以根据需要设定 |
单个用户 |
客户端 |
Viewstate |
小量、简单的数据 |
一个Web页面的生命期 |
单个用户 |
客户端 |
Cache |
任意大小 |
可以根据需要设定 |
所有用户 |
服务器端 |
隐藏域 |
小量、简单的数据 |
一个Web页面的生命期 |
单个用户 |
客户端 |
查询字符串 |
小量、简单的数据 |
直到下次页面跳转请求 |
单个用户 |
客户端 |
Web.Config文件 |
不变或极少改变的小量数据 |
直到配置文件被更新 |
单个用户 |
服务器端 |