昨天偶然看到网上有人讨论究竟是该用viewstate还是session来保存信息. 忽然觉得有必要去深入的研究一下这两个东东了.
我们先来看深入分析一下viewstate, 为了分析的相对完整性,先从简单的说起:
在asp时代, 大家都知道一个html控件的值,比如input 控件值,当我们把表单提交到服务器后, 页面再刷新回来的时候, input里面的数据已经被清空. 这是因为web的无状态性导致的, 服务端每次把html输出到客户端后就不再于客户端有联系.
asp.net巧妙的改变了这一点. 当我们在写一个asp.net表单时, 一旦标明了 form runat=server ,那么,asp.net就会自动在输出时给页面添加一个隐藏域
<input type="hidden" name="__VIEWSTATE" value="">
那么,有了这个隐藏域,页面里其他所有的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面. 每次页面提交时一起提交到后台,asp.net对其中的值进行解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8....
很多人会认为这是加密的信息,其实不是, ms仅仅是给各个控件和页面的状态存入适当的对象里面,然后把该对象序列化, 最后再做一次base64编码,直接赋值给viewstate控件.
说到这,想必你一定想看看这个viewstate里面到底存了哪些东西, 嗯,你是可以写一个base64 to string的转换代码来实现.不过,viewstate是有层次之分的,普通的转换后,你看到的也是很乱的文字. 这里提供了一个专门转换viewstate值的地方 http://www.wilsondotnet.com/Demos/ViewState.aspx . 你可以去将自己的viewstate输入进去,让它给你转化一下,这可是带结构的哦
好, 以上说的这些你可能会觉得: 这与session有什么关系? 这个viewstate不是由asp.net自动去维护吗? 是的, 如果仅仅是保存控件的状态, 你可以感觉不到它与session有什么瓜葛( 呵呵,其实它们就没有瓜葛),不过,接下来,我们看看这种使用方法: 在后台aspx.cs代码里:
private void Page_Load(object sender, System.EventArgs e)
{
ViewState["myvalue"] = "viewstatevalue";
//.....
}
呵呵, 可以在页面后台直接给viewstate集合赋值, 现在你是不是觉得和session的使用方法差不多了呢? 对,这一点就是几乎所有初学asp.net的人的疑惑. 会认为asp.net也像session那样把这个值保存到服务器内存里面, 其实不是!
那么,这里的viewstate值是属于谁?又存在哪里? 其实,它和上面的其他控件的状态保存一样,也是存储到那个隐藏的viewstate控件值里面, 上面已经说了, viewstate用来保存状态,包括页面本身, 那么,这里的viewstate就属于页面本身的状态.
分析到此,估计大家对viewstate的使用应该是没有什么疑问了. 那么,我们可以来与session做一下类比, session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重. 而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此, 我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面. 而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上. 另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期.
但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定义的一些类型.
当然,任何事物都有两面性, 使用viewstate会增加页面html的输出量,占用更都的带宽,这一点是需要我们慎重考虑的. 另外, 由于所有的viewstate都是存储在一个隐藏域里面,用户可以很容易的通过查看源码来看到这个经过base64编码的值.然后再经过转换就可以获取你存储其中的对象和变量值.
其实,对于viewstate的安全性问题,asp.net还给我们提供了更多的选择.一般如果要保护viewstate有两种方式: 一种是防篡改,一种是加密. 一说到防篡改,我们就想起了使用散列代码. 没错, 我们可以在页面顶部加入如下代码:Page EnableViewStateMAC=true
这样asp.net就会自动的在viewstate中追加一个散列码,在页面回传时,服务器根据回传的viewstate生成一个散列码,再与回传的散列码相比较,如果不对,则丢弃该viewstate,同时控件将恢复初试状态. (默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation="MD5"即可)
而viewstate加密就更简单了, 只要在machine.config里设置一下machineKey validation="3DES"即可实现用des加密viewstate了.
分享到:
相关推荐
与`Session`不同,`Cookie`可以跨多个页面甚至不同会话持久存在,除非用户手动删除或设置的过期时间到达。`Cookie`通常用于存储用户偏好设置、登录状态等非敏感信息,因为它们可能被用户查看或修改。需要注意的是,`...
### Session与ViewState用法详解 在.NET框架中,Session与ViewState是两个非常重要的概念,它们分别用于维护跨页面请求的数据状态以及保存控件状态。本文将深入探讨这两个特性,并通过具体的示例帮助读者更好地理解...
比较学习ASP.net中的Session、ViewState、Application、Cookies
### Session、Application、Cookie 和 ViewState 的用法 在Web开发中,管理用户会话和状态是构建交互式网站的关键组成部分。本文将详细解释Session、Application、Cookie 和 ViewState 的概念及用法,帮助开发者更...
与Application对象不同,Session对象的数据是针对每个用户的。 1. **用途与特点** - **私密性**: 每个用户都有自己的Session数据。 - **生命周期**: 用户会话的持续时间加上一定的时间(通常是20分钟)。 - **...
ViewState与Session的作用类似,但作用范围更小,仅限于页面生存期。 4. **Cookie对象**: - Cookie对象允许在客户端浏览器中存储信息,这些信息可以跨多个页面请求持久化。Cookie具有Name(获取或设置名称)、...
### Application、Session、Cookie、ViewState、Cache、Hidden 的区别与应用 #### Application - **信息量大小**:可存储任意大小的数据,适用于全局共享信息,如网站计数器、配置参数等。 - **作用域和保存时间**...
下面详细介绍ViewState的原理、用法、与Session的对比以及使用ViewState时需要注意的事项。 ### ViewState原理 ViewState的主要原理在于通过隐藏字段 "__VIEWSTATE" 在客户端保存页面的状态信息。当用户与页面交互...
Session 对象用于存储单个用户的数据,它的生命周期通常与用户的浏览器会话保持一致,即用户关闭浏览器或超过预设的无活动时间(默认20分钟)后,Session 数据将被清除。Session 对象适合存储用户个性化信息,如...
然后,服务器会在服务器端创建与该SessionID关联的Session对象,用来存储用户的相关数据。 #### 三、Session的生命周期 1. **创建**:当用户首次访问应用时。 2. **使用**:在整个会话过程中,可以读取和修改...
然而,由于ViewState数据的体积通常较大,它会增加页面的大小,从而影响加载速度,尤其是在用户与大量交互控件的页面上。因此,有些开发者会选择将ViewState移出HTML,将其保存在服务器端以优化性能和用户体验。 ...
Application,Session,Cookie,ViewState和Cache生命周期
#### ViewState与Session:选择状态存储策略 为了解决这一问题,可以采用两种主要策略:`ViewState`和`Session`。在这篇文章中,我们将重点讨论使用`ViewState`来保存用户的选择状态,因为它比`Session`更节省...
Session是ASP.NET提供的一种服务器端状态管理方式,用于存储与特定用户会话相关的信息。当用户访问网站时,ASP.NET会为该用户创建一个唯一的SessionID,并通过Cookie将其发送回浏览器。之后,每次请求时,浏览器都会...
1. **ViewState与Session**: 两种常见的状态管理机制,ViewState在客户端,Session在服务器端,用于保持用户会话信息。 2. **Application和Cache**: 应用程序级状态管理和缓存机制,用于在整个应用程序或服务器上...
ViewState是ASP.NET框架中的一个关键概念,它是一种服务器端状态管理机制,用于在用户与Web应用程序交互时保持页面控件的状态。在Web应用中,由于HTTP协议的无状态特性,每次请求都是独立的,无法自动保存之前请求的...
在 ASP.NET 中,有多种保存信息的对象,例如 Application、Session、Cookie、ViewState 和 Cache 等,每一种对象都有其特点和应用场景。下面我们将详细介绍每一种对象的特点和应用场景。 Application 对象 ...
每次客户端请求服务器时,都会携带这个Session ID,服务器据此识别出是哪个用户的请求,并获取到与之关联的Session数据。 Session的应用场景非常广泛,包括但不限于: 1. 存储登录信息:用户登录后,可以将用户名...
考虑使用Session或Cookie替代Viewstate;或者使用ViewStateMode属性进行精细控制。 6. **安全性考虑**:虽然Viewstate提供了方便,但其数据默认是可读的。因此,敏感信息不应存储在Viewstate中,以免被恶意用户截取...