ViewState与Session之研究
看了这篇文章写的比较好,转上来了...
昨天偶然看到网上有人讨论究竟是该用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了.
呵呵,至此,我们对viewstate应该有个很清晰的认识了, 不过,初步研究viewstate, 理解有误之处还望大家多指教
分享到:
相关推荐
此外,安全性研究人员也可以使用它来识别潜在的安全漏洞,比如过度敏感信息被保存在ViewState中。 使用ViewStateDecoder2.0,用户可以: 1. **查看控件状态**:了解每个控件的值和属性是如何在ViewState中编码的。...
ASP.NET是一种由微软开发的服务器端Web应用程序框架,主要用于构建动态网站、 web 应用程序和 web 服务。...通过下载和研究这个项目,你可以深入理解ASP.NET如何与前端技术相结合,以实现动态和响应式的用户界面。
本项目“ASP.NET技术在网站开发设计中的研究与开发”深入探讨了如何利用ASP.NET进行高效且功能丰富的网站构建。 首先,ASP.NET的核心优势在于它的事件驱动模型,它允许开发者创建类似桌面应用程序的用户体验,用户...
4. **状态管理**:Asp.NET控件通过ViewState、Session、Cookie等方式管理页面状态,使得页面在Postback过程中能保持数据。虽然ViewState是最常见的,但需要注意其会增加页面大小,可能影响性能。 5. **自定义控件**...
5. 状态管理:ASP.NET提供了多种状态管理机制,如ViewState、Session、Cookie等,用于在页面之间保持数据。在这个留言板中,可能会用到ViewState或Session来跟踪用户的信息和留言状态。 6. 数据绑定:ASP.NET支持...
本项目“基于ASP.NET技术在网站开发设计中的研究与开发”深入探讨了如何利用ASP.NET进行高效、功能丰富的网站开发,并提供了完整的论文、源代码和开题报告,为学习者提供了全面的学习材料。 首先,ASP.NET的核心...
ASP.NET 2.0引入了许多新特性,如母版页(Master Pages)、控件生命周期改进、内置状态管理机制(ViewState, Session, Application等)以及强大的数据绑定控件(GridView, FormView等)。这些概念对于构建动态网页...
### 基于ASP.NET的库存管理系统的研究与开发 #### 一、引言 随着信息技术的飞速发展,企业对信息化管理的需求日益增加。在众多的企业管理信息系统中,库存管理系统因其能够有效提升企业的物流效率、降低运营成本而...
6. **状态管理**:ASP.NET提供了多种状态管理机制,如ViewState、Session、Cookie等,用于在多个页面间保持数据。在留言本中,可能使用ViewState或Session来存储用户信息或临时数据。 7. **安全性**:为了保护用户...
3. **状态管理**:ASP.NET通过ViewState和Session等方式,解决了Web的无状态问题,使开发者能轻松跟踪用户会话。 4. **页面生命周期**:ASP.NET页面有明确的生命周期,包括初始化、加载、回发、呈现等阶段,方便...
- **C#与ASP.NET的结合**:理解C#代码如何与ASP.NET控件、HTTP生命周期、路由系统和ASP.NET的其他特性(如ViewState和Session)交互。 - **数据库交互**:查看如何使用ADO.NET或Entity Framework进行数据库操作,...
4. **ViewState和Session**:在跨应用程序的拖放操作中,可能需要使用ViewState或Session来临时存储和传递数据。ViewState是ASP.NET特有的机制,用于在页面生命周期内保持控件状态;Session则在所有页面间共享数据,...
ASP.NET基于.NET Framework,提供了丰富的服务器控件、页面生命周期管理、状态管理机制(如Viewstate和Session)以及强大的数据绑定功能。开发者可以使用C#或VB.NET等.NET语言编写代码,同时,ASP.NET MVC和ASP.NET ...
此外,ASP.NET中的状态管理机制,如ViewState和Session,也可能在这个系统中发挥作用。ViewState用于在页面间保持控件的状态,而Session则可以存储用户会话信息,如登录状态、贷款申请详情等。 考虑到这是一个毕设...
本项目以"毕业答辩-ASP.NET技术在网站开发设计中的研究与开发(论文源代码开题报告).rar"为主题,深入探讨了ASP.NET在实际网站开发中的应用与研究。 首先,开题报告通常会涵盖以下几个关键部分:项目背景、研究意义...
ASP.NET提供了ViewState、Session和Cookie等状态管理机制,用于在请求之间保持数据。在这个项目中,可能会使用ViewState或Session来存储用户的图片处理参数或临时图片。 8. **安全与性能**: 对于用户上传的图片...
每个Web表单页都有一个与之关联的生命周期,在这个过程中,控件被创建、初始化、数据绑定、验证,并最终呈现给用户。通过源码例子,你可以看到如何在这些阶段中添加代码来处理特定任务。 3. **控件事件处理** ASP...
这部分可能涵盖ViewState、Session、Cookie和Application等状态管理机制。 7. **ASP.NET配置和部署**:如何配置ASP.NET应用程序和在不同的服务器环境上部署应用是实践中必不可少的知识。这部分可能包含IIS设置、Web...
7. **ASP.NET的核心概念**:包括页面生命周期、状态管理(ViewState、Session、Cookie等)、缓存策略、异常处理、全局配置等。 8. **论文部分**:通常,论文会详细介绍项目的背景、需求分析、设计思路、实现方法和...