1.对比汇总
No | 名称 | 适用范围 | 传递数据量大小 | 安全性 | 备注 |
1 | Get方式 (QueryString) |
页面间传递数据 | 少量数据 (最长为255个字符) |
不安全 (数据暴露在url中) |
方式:利用Get方式提交,参数附加到url上。 特点:简单、方便。 缺点:字符串长度最长为255个字符;数据泄漏在url中。 适用数据:简单、少量、关键的数据。 适用范围:传递给自己、传递给另一个目标页面;常用于2个页面间传递数据。 存储位置:URL地址中 用法:如:url后加?UserID=…,跳转到目标页面, 目标页面用Request.QueryString["UserID"]获取参数值 |
2 | Post方式(Form) | 页面间传递数据 | 大数据 | 相对安全 | 方式:利用form方式提交。 特点:常用技巧是把隐秘的数据存在隐藏域中由form提交。 适用数据:大量数据,包括文件上传。 适用范围:传递给自己、传递给另一个目标页面;常用于2个页面间传递数据。 存储位置: 存储在Http的body中(Post提交的表单数据存储在http body中) 用法:在客户端form指定action目标后submit提交,在目标页面用Request.Form["txtName"]获取 |
3 | Server.Transfer (页面对象的属性) |
页面间传递数据 | 大数据 | 相对安全 | 方式:asp.net特有方式
。利用HttpContext获取发请求的页面的信息。 特点:可以直接存储对象。 缺点:注意强制转换的类型要正确。 适用数据:各种数据。 适用范围:页面之间传递复杂数据。 用法:获取Context.Handler将其转换为发请求的页面的实例,随后就可以轻松访问其form中的字段、甚至属性。其中的Context是指HttpContext对象,Handler是其属性,Context.Handler的意思可以理解为创建源页类的实例变量,而得到此实例之后,就可以直接访问其中的属性和Public方法了。 使用server.Transfer(url)提交,目标页面可以用Request.Form["txtName"]获取数据 |
4 | Cookie | 单个用户/站点所有页面 | 少量数据 | 不安全 (存储在客户端) |
方式:将数据存在客户端的经典方法。 缺点:安全性低、受客户端设置限制、一个站点仅存20个cookie,每个容量4096字节。 有效期:自定义或被用户清除 适用数据:用户的会话数据(一般是用户名,用户的个性化设置信息等) 适用范围:单个用户、整个站点所有页面 存储位置:存储在客户端浏览器中 用法:引用Request.Cookies(读取信息)、Response.Cookies(写入信息) 、或用HttpCookieCollection直接创建Cookie对象。 |
5 | Session | 单个用户/站点所有页面 (整个会话期) |
大数据 (内存中,取决于内存大小) |
相对安全 | 方式:数据存储在服务器端。 特点:asp.net中可以设置session的存储方式、位置、SessionID的保存是否依赖cookie。 可以直接存储对象。 缺点:默认存储在进程中的, 有失效的隐患 有效期:用户活动时间+自定义延迟。 适用数据:用户的特有信息。 适用范围:单个用户、整个站点所有页面。 存储位置:存储在服务器的内存中 用法:Session["User"] = value/object; |
6 | ViewState | 页面自身传递数据 | 大数据 | 不安全 | 方式:asp.net特有机制,用来保存页面状态信息。 特点:将页面各控件及其所存数据序列化存在name为_ViewState的隐藏域中。 缺点:存在HTML中,安全性较低。可以设置加密和验证,但数据量会大增、效率有影响。 有效期:有效期等于页面的生命周期。 适用数据:页面PostBack需要保存的数据,数据太大会影响页面发送效率。 Web服务器控件都是用ViewState在页面PostBack期间保存状态 适用范围:页面自身数据保存。 存储位置:存储在页面的html中 用法:ViewState["User"] = value;(测试是否可以存储对象) |
7 | Appliction | 所有用户/站点所有页面 | 大数据 | 相对安全 | 方式:将数据存储于此,相当于全局变量。 特点:可以直接存储对象。整个站点的共享数据。 有效期:应用程序生命周期。 适用数据:所有页面、所有用户共享的数据。 存储位置:存储在服务器的内存中 用法:Appliction["User"] = value|object; |
8 | Cache | 所有用户/站点所有页面 | 大数据 | 相对安全 | 方式:将用户数据存储在服务端数据缓存中。 特点:可以大大提高效率。 可以直接存储对象。 缺点:数据更新不及时。 有效期:应用程序生命周期或自定义。 适用数据:所有页面、所有用户都可以共享的数据。 存储位置:存储在服务器端的缓存中 用法:Cache["User"] = value|object; 不需要则关闭 @page 里面设置EnableViewState=false |
9 | Static变量 | 所有用户/此类所有的页面 | 大数据 | 相对安全 | 方式: 将数据存于静态变量中。 特点:利于提高效率。 缺点:若用不好会致使用户或页面间数据紊乱,造成极大的隐患。 建议只赋值一次,绝对禁 止为单个用户而更改此值。 适用数据:所有用户共享的数据。 适用范围:此类所有的页面实例。 存储位置:存储在服务器的内存中 用法:在class中声明静态变量。 |
2.总结
应用范围:
(1)页面自身保存数据可用的有ViewState,static变量
(2)页面之间传递数据常用get,post,HttpContext,当然可以变通一下用于自身数据保存
(3)单用户的所有页面数据共享常用session,cookie
(4)整个应用程序(所有用户所用页面)的数据共享常用Appliction,cache,static变量
建议
在用Request的时候要指明所取的集合,比如Get方法传来的参数从QueryString集合取,Post的从Form取,Cookie从Cookies里取。
虽然用Request[]集合,以上几种都可以取到,但是却造成性能上的浪费,本来直接在Form集合中,却遍历了QueryString,Form,Cookies等集合才取出来。
3.相关源码
4.参考网址:
http://www.cnblogs.com/shengtianlong/archive/2010/08/11/1797608.html