viewstate java_ASP.NET之ViewState

viewstate java_ASP.NET之ViewState什么是ViewState?在asp时代,大家都知道一个html控件的值,比如input控件值,当我们把表单提交到服务器后,页面再刷新回来的时候,input里面的数据已经被清空.这是因为web的无状态性导致的,服务端每次把html输出到客户端后就不再与客户端有联系.asp.net巧妙的改变了这一点.当我们在写一个asp.net表单时,一旦标明了formrunat=server,那…

大家好,又见面了,我是你们的朋友全栈君。

什么是ViewState?

在asp时代, 大家都知道一个html控件的值,比如input 控件值,当我们把表单提交到服务器后, 页面再刷新回来的时候, input里面的数据已经被清空. 这是因为web的无状态性导致的, 服务端每次把html输出到客户端后就不再与客户端有联系.

asp.net巧妙的改变了这一点. 当我们在写一个asp.net表单时, 一旦标明了 form runat=server,那么,asp.net就会自动在输出时给页面添加一个隐藏域

那么,有了这个隐藏域,页面里其它所有的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面.每次页面提交时一起提交到后台,asp.net对其中的值进行解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8….

很多人会认为这是加密的信息,其实不是, Microsoft仅仅是给各个控件和页面的状态存入适当的对象里面,然后把该对象序列化, 最后再做一次base64编码,直接赋值给viewstate控件.

说到这,想必你一定想看看这个viewstate里面到底存了哪些东西, 嗯,你是可以写一个base64 to string的转换代码来实现.不过,viewstate是有层次之分的,普通的转换后,你看到的也是很乱的文字. 这里提供了一个专门转换viewstate值的地方 http://www.wilsondotnet.com/Demos/ViewState.aspx .你可以去将自己的viewstate输入进去,让它给你转化一下,这可是带结构的哦

:)

viewstate是如何工作的?

viewstate保存最后一次在服务器上处理的页面状态。它不能保存那些被动态改变的控件的值。

所有的服务器端控件都有一个ViewState属性。如果它是enable的,这个控件的viewstate就起作用了。那viewstate是在哪里,是如何存储的呢?当一个页面第一次加载,所有的控件被序列化到viewstate,保存在一个叫_ViewState的隐藏form字段里。这个隐藏字段对应服务器端的ViewState对象。页面的ViewState使用System.Web.UI.StateBag对象存储键值对。当一个回传发生,页面反序列化ViewState然后恢复所有的控件。页面中保存控件的ViewState以base

64 编码格式存储成name – value。当一个页面重新加载,会调用两个和ViewState相关的方法,LoadViewState 和SaveViewState。下面是我的一个页面中的_ViewState隐藏字段。

启用和禁止ViewState

在默认情况下,所有服务器控件的viewstate开启状态,通过以及几种途径来禁止。

1.页面级别

or

2.控件级别

or

3.应用程序级别

or

4.机器级别

or

在viewstate中保存和取出值

viewstate能处理以下的类型

基本类型,基本类型数组,ArrayList 和Hashtable,任何可以序列化的对象。

以下代码是将ArrayList存到viewstate中并取出

ArrayList obj = new ArrayList();

//Some code

ViewState[“ViewStateObject”] = obj;

obj = ViewState[“ViewStateObject”];

性能问题

为了更好的页面呈现性能,viewstate应该尽可能的小。要记住Viewstate中的数据会占用很多的网络带宽。因此我们要谨慎的利用viewstate。如果页面和控件不需要回传,那么就要禁止viewstate属性。通常在aspx页面之外保存Viewstate会取得更好的性能表现。为了达到这个目的,我们可以使用SavePageStateToPersistenceMedium 和LoadPageStateFromPersistenceMedium 这两个方法。在web.config或machine.config设置来禁止某个程序的所有页面或全部程序页面的viewstate。

注意只有控件包含在

里才能存储viewstate。然而即使页面所有的viewstate被禁止,页面仍然在viewstate中保存20字节的数据,用来在回传时为相应的控件分配viewstate中的数据。所以当页面完全没有回传,移去runat=”server”能减少20字节的数据。如果有很多这样的页面,20字节的节省也能在一定程度上减少带宽。viewstate应该在必要的时候使用。在DataGrid和DataRepeater这样的控件中要避免使用viewstate,因为这些控件的viewstate占用数据相当大。

下面我提供一个简单的用于计算页面viewstate大小的方法。创建一个MasterPageBase类,然后其它所有的页面都要继承它。

public class MasterPageBase: System.Web.UI.Page

{

protected override void OnPreRender(EventArgs e)

{

object viewStateObject = HttpContext.Current.Request[“__VIEWSTATE”];

if (viewStateObject == null)

HttpContext.Current.Trace.Warn(“The ViewState Size is:”, “0”);

else

HttpContext.Current.Trace.Warn(“The ViewState Size is:”,

HttpContext.Current.Request[“__VIEWSTATE”].Length.ToString());

base.OnPreRender(e);

}

}

安全问题

可以采取两个措施来避免viewstate被仿冒

使用EnableViewStateMac属性

给 ViewState中的内容加密

EnableViewStateMac会进行一个机器授权验证(MAC),这应在页面级别或程序级别使用。当设置时,这个属性会在viewstate呈现之前附加一个viewstate的hash值。当回传发生时,hash值会被重新计算和核对。如果他们不匹配,页面会拒绝显示,这样就确保了viewstate没有被纂改。

在machine.config中设置对viewstate内容的加密

or

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162424.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 并查集

    并查集

  • 大数据分析系统[通俗易懂]

    大数据分析系统[通俗易懂]1. 概念、分类数据分析系统的主要功能是从众多外部系统中,采集相关的业务数据,集中存储到系统的数据库中。系统内部对所有的原始数据通过一系列处理转换之后,存储到数据仓库的基础库中;然后,通过业务需要进行一系列的数据转换到相应的数据集市,供其他上层数据应用组件进行专题分析或者展示。根据数据的流转流程,一般会有以下几个模块:数据收集(采集)、数据存储、数据计算、数据分析、数据展示等等。当然也会有…

  • 关闭networkmanager服务_电脑不小心禁用了无线网络怎么办

    关闭networkmanager服务_电脑不小心禁用了无线网络怎么办NetworkManager服务是管理和监控网络设置的守护进程,CentOS7更加注重使用NetworkManager服务来实现网络的配置和管理它是一个动态的,事件驱动的网络管理服务。常用管理命令:查看#systemctlstatusNetworkManager开启#systemctlstartNetworkManager关闭#systemctlstopNetworkManager不可用#systemctldisableNetworkManager可用#

  • Vmware安装Ubuntu16.4、Ubuntu里安装python3.9、Ubuntu安装PyCharm的过程及出现的问题的解决[通俗易懂]

    Vmware安装Ubuntu16.4、Ubuntu里安装python3.9、Ubuntu安装PyCharm的过程及出现的问题的解决[通俗易懂]目录1、VMware安装Ubuntu16.4虚拟机1.1、下载Ubuntu镜像文件1.2、安装Ubuntu虚拟机1.2、装Ubuntu系统和虚拟机工具1.3、解决Ubuntu不能全屏显示1.4、设置共享文件夹1.4.1、主机上的文件夹设置1.4.2、虚拟机上的设置1.5、解决/mnt下没有hgfs文件夹1.6、解决找不到共享文件夹的问题1.7、解决重启后共享文件夹没有了的问题2、Ubuntu安装Python3.92.1、安装Python3.92.

  • 计算机操作系统-操作系统的定义

    计算机系统的层次结构 用户 应用程序 操作系统 纯硬件:CPU、RAM、ROM 其中,操作系统:从操作系统层往两侧看:负责管理协调硬件、软件等计算机资源的工作 从上往下看:为上层的应用程序和用户提供简单易用的服务 从下往上看:操作系统系统软件,而不是硬件定义OperatingSystem是指控制和管理整个计算机系统的硬件和软件资源,并合理地组…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号