为web页面及其控件保持状态信息是非常有必要的。然而,由于web应用程序创建于http协议的顶层,这是一个无状态的协议,因此,保持状态信息则变得非常困难。为了解决这个问题,asp.net 2.0技术提供了多种解决方案,例如,利用session、cookie、视图状态、控件状态、隐藏域、查询字符串、个性化用户配置(profile)等等。对于利用asp.net 2.0技术创建服务器控件而言,保持状态信息也是非常重要的,其主要解决途径是利用视图状态和控件状态。本文详细讲解了视图状态(viewstate)的基本知识,并通过典型应用介绍视图状态的应用方法。
视图状态概述
视图状态是一项非常重要的技术,它能使得页面和页面中的控件在从服务器到客户端,再从客户端返回的往返过程中保持状态信息。这样就可以在web这种无状态的环境之上创建一个有状态并持续执行的页面效果。本节主要介绍有关视图状态的运行机制、应用方法、存储的数据类型、性能和安全性、视图状态分块(这是asp.net 2.0的新特性)和优缺点等内容。
(1)运行机制
视图状态的具体运行过程为:每当用户请求某个.aspx页面时,.net框架首先把相关控件的状态数据序列化成一个字符串,然后,将其做为名为__viewstate的隐藏域的value值发送到客户端。如果页面是第一次被请求,那么服务器控件也将是被第一次执行时,名为__viewstate的隐藏域中只包含控件的默认信息,通常为空或者null。在随后的回送事件中,viewstate中就保存了服务器控件在前面回送中可用的属性状态。这样服务器控件就可以监视在当前被处理的回送事件发生之前的状态了。这些过程是由.net框架负责的,对用户来说是执行.aspx页面就有了持续执行的效果。
(2)存储的数据类型
视图状态可以存储多种类型的数据,并且为了提高运行效率,视图状态自身还包括一套已经优化的针对常用类型的序列化方式。视图状态序列化方式默认支持的数据类型包括以下几种:string、int32、unit、color、array、arraylist、hashtable和自定义类型转换器typeconverter。
视图状态已经为array、arraylist和包含上面列出类型的hashtable对象进行了优化。因此,当在控件中使用视图状态时,应该试着限定于使用以上简单数据类型,以及经过优化的类型。在此,需要重点说明一下自定义类型转换器typeconverter,它提供了一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法。例如,可以利用typeconverter将字符串转换为数值,或者将数值转换为字符串。如果没有类型转换器,那么页面框架会使用.net框架提供的二进制序列化功能来序列化对象,这个过程是非常耗费资源的。
(3)性能和安全性
使用视图状态时,对象必须先序列化,然后再通过回传进行反序列化。因此,我们必须了解有关viewstate性能的内容。默认情况下,控件的viewstate将被启用,如果不需要使用viewstate,最好还是将它关闭。以下情况将不再需要viewstate:(1)控件未定义服务器端事件(这时的控件事件均为客户端事件且不参加回送的);(2)控件没有动态的或数据绑定的属性值。关闭视图状态的方法是将控件的enableviewstate的值设置为"false",即enableviewstate="false"。
默认情况下,视图状态的有关内容在编译运行发送给客户端时,读者将在页面的html代码中看到__viewstate隐藏域内容。这是一些没有意义的字符串,是.net框架通过base64位编码对相关内容编码的结果。它们是通过明文方式在客户端和服务器端之间往返传送。在某些情况下,例如涉及密码、账号、连接字符串等敏感内容时,使用默认方式是很不安全的。为此,.net框架为viewstate提供了两种安全机制:
· 校验机制:
可以通过设置enableviewstatemac="true"属性来指示.net框架向viewstate数据中追加一个散列码(该散列码是一种sha1类型,长度有160位,因此会严重影响执行性能)。在回传事件发生时,将重新建立该散列码,它必须和最初的散列码匹配。通过这种方式,能够有效检验viewstate是否在传送过程中能够被篡改。默认情况下,.net框架使用sha1算法来生成viewstate散列代码。此外,也可以通过在machine.config文件中设置<machinekey>来选择 md5 算法,如下所示:<machinekey validation="md5" />。md5算法的性能要比sha1算法好一些,但是同样不够安全。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器