昨天偶然看到网上有人讨论究竟是该用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, 理解有误之处还望大家多指教 :)

转自(http://blog.csdn.net/ianc/archive/2006/06/16/803141.aspx)

转载于:https://www.cnblogs.com/DotNetEarthworm/archive/2008/12/23/1360527.html

【转】浅论ViewState及其与Session的关系相关推荐

  1. 浅论ViewState及其与Session的关系

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

  2. 会话Cookie及session的关系(Cookie Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

  3. python axes_浅谈matplotlib.pyplot与axes的关系

    最近在学习数据可视化,梳理一下其中一些诸如pandas绘图.matplotlib绘图.pyplot(plt).axes等概念. 重要的事情说三遍:axes不是axis!axes不是axis!axes不 ...

  4. 浅谈ViewState

    一.ViewState概述 ① ViewState是基于webform的 ② 在web窗体控件属性处设置runat = "server",这个控件会被附加一个隐藏的属性_ViewS ...

  5. mysql中数据库database、实例instance、会话session的关系

    1. No suitable driver found for http://127.0.0.1:3306/test jdbc_url错误,jdbc走自己的协议. 正确的路径应该是:jdbc:mysq ...

  6. 程序员过关斩将--cookie和session的关系其实很简单

    喜欢就点关注吧! 月高风下,下班路上.... 菜菜哥,告诉你一个秘密,但是不允许告诉任何人 这么秘密,你有男票了?~ 不是,昨天我偷偷去面试了,结果挂了 这不是好事吗,上天让公司留住你..... 好吧 ...

  7. django 中的用户身份验证和 session 的关系

    Session session 的数据存在数据库中,它在客户端是用 cookie 来识别的,作为一个票据.这个 cookie 的名称,默认就叫 "sessionid",但是可以通过 ...

  8. Cookie和Session的关系(个人理解)

    之前,总是使用Session,Cookie接触的比较少,通过这次的项目,使我了解了,这两者的关系与用法.首先先简单聊几句两者的概念: Session是客户端与服务器的会话,session是存储在服务器 ...

  9. Servlet 和Session的关系

    jsp的Session和Servlet的Session本质上是一致的,区别是:jsp中session是作为隐式对象存在的,可以直接使用:Servlet中的session需要手动提取后才能使用. Htt ...

  10. 张钹院士:浅谈人工智能与大数据的关系

    来源:联合时报 本文共2385字,建议阅读5分钟. 本文主要浅谈了人工智能和大数据的关系以及中国在人工只能领域对世界的超越. 中国科学院院士张钹对国内外人工智能产业发展现状,提出我国仅靠跟随性的应用深 ...

最新文章

  1. spark2.2读写操作hive和mysql数据库
  2. 微信小程序开发 Request Headers: Provisional headers are shown
  3. 【ArcGIS风暴】ArcGIS中国地表覆盖数据GlobeLand30预处理(批量投影、拼接、掩膜提取)附成品下载
  4. python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!
  5. les物流执行系统_【精益运营】立足智慧物流 推进仓储智能化稳步升级
  6. oracle负数怎么比较大小,输出负数【oracle学习吧】_百度贴吧
  7. 学习爬虫过程中遇到的问题总结
  8. HTTP Status 400,400 (Bad Request)
  9. MySQL安装时Download界面为空,不显示需要下载的组件,MySQL Installer 8.0.28.0 Download界面为空解决方案
  10. BitMEX将调整Impact Notional和Index Price Protection两个参数
  11. centos6.2系统下安装配置FastDFS步骤
  12. python 欢迎自己程序编写_神操作!一句查询让Python帮忙自己写程序
  13. win10+eclipse+hadoop2.6.0 开发环境
  14. js调用数科阅读器_aspx调用js函数
  15. win7系统计算机怎么更改密码,Win7系统怎么设置和删除电脑开机密码?
  16. android京东源码下载,京东商城APP - 源码下载|通讯/手机编程|android开发|源代码 - 源码中国...
  17. Palantir的研究到金融风控(二)
  18. 17.JAVA对象的进阶
  19. 海思3559万能平台:VGS的画线处理
  20. Android的绘画软件,可以画漫画的软件有那些?你们要的安卓绘画软件,拿走吧!...

热门文章

  1. 如何在Mac上使用Memoji贴纸、屏幕效果、应用程序和Messages
  2. 如何使用Movavi Video Editor制作幻灯片?
  3. 拇指接龙游戏从WIN32向Android移植过程问题记录(1)
  4. 高性能集群软件Keepalived之安装配置篇
  5. windows 系列机器查看tcp 配置
  6. 并发---ConcurrentHashMap
  7. Windows Server 2008 R2之三管理活动目录数据库
  8. POJ-1087 A Plug for UNIX 网络流
  9. C++新标准——C++1x
  10. RabbitMQ 中的 7 种队列模式,写得太好了!