在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了.

转载于:https://www.cnblogs.com/guodapeng/archive/2007/11/13/958313.html

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

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

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

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

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

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

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

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

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

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

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

  6. Servlet 和Session的关系

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

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

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

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

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

  9. 论文浅尝 | PairRE: 通过成对的关系向量实现知识图谱嵌入

    笔记整理:黎洲波,浙江大学硕士,研究方向为自然语言处理.知识图谱. 研究背景 知识图谱因其在问答.语义解析和命名实体消歧等任务取得了良好的效果而受到广泛关注,而大部分知识图谱都存在不全和缺失实体链接的 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:目标检测
  2. Mybatis各种模糊查询及#和$区别
  3. java中直角三角形第三条边,Java编程,根据输入三角形的三个边边长,程序能判断三角形类型为:等边、等腰、斜角、直角三角形,求代码...
  4. Android平台使用Camera2(5.0+)替代过时的Camera
  5. MySQL 开源工具集合
  6. Python爬虫扩展库BeautifulSoup4用法精要
  7. acfun html5 转换,AcFun剧场模式插件
  8. BXP_4.1安装配置及域应用随记一
  9. Flutter 高级篇-所有知识点架构
  10. IDC:2021年云上数据量超过传统数据中心,All in Cloud是趋势
  11. Cisco 证书查询
  12. 测试页能打印 软件不能打,打印机可以打印测试页不能打印文档怎么处理
  13. 绝对纯净:龙行天下GHOST XP SP3软件自选安装纯净版 2010 V13.0 2010年6月
  14. Padavan固件添加adbyby去广告功能
  15. python 当前时间增加一个月
  16. Kubernetes 管理员认证(CKA)考试笔记(二)
  17. SX1262 与 SX1278、SX1276 有什么区别?
  18. 690家门店送万份小食 汉堡王“战舰世界堡胃战”活动开启
  19. LVGL v8学习笔记 | 06 - label控件的使用方法
  20. 华为各类工程师通信基础面试题目及答案

热门文章

  1. changePage() 页面跳转
  2. 服务器图片(绝对地址) 客户端显示问题
  3. C#使用Mutex实例详解
  4. 自动化设备的软件框架
  5. 理解图像的傅里叶变换
  6. C#中OpenFileDialog获取文件名和文件路径的常用方法.
  7. 时间戳转换(各种格式的都有,年月日 时分秒 周)
  8. flash air 解析html,AIR 程序内部显示网页,并可以点击浏览的方法(HTMLLoader、StageWebView)...
  9. linux history命令显示时间_每天一条Linux命令(29) more (分页显示内容)
  10. 如何设置取消小票的二维码