Session,ViewState用法
基本理论:
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存取。
在webgis中,地图的各种相关状态,如zoom, center, layers, visibility等,用viewstate存取的话,就不存在session过期的问题,网页可以永远使用,甚至可以下载保存,在进行地图请求,或iframe到第三方的应用中。
昨天看到一个文章,作者在自己的页面中定义了几个全局变量,类型是static,但是这样的定义会存在问题,当一个用户访问的时候不会有问题,但是当大量用户并发访问系统的时候,页面中的这些static类型的全局变量就会出现问题了,然后作者改用了Session变量保存以前由static类型全局变量纪录的数据,因为Session是状态量,只是和某个访问进程相关,这样就不会出现由于static类型引起的问题了。
但是这样的话系统中的Session就太多了,我总认为这样不太好,虽然每个一个Session都有一个ID不会冲突。ASP.NET引入了ViewState,可以记录同一个页面的不同PostBack中的一些数据值。
所以我的解决方法是:使用例如ViewState["name"]这样的形式记录以前static的全局变量,这样就可以避免这个问题了,因为我的系统是在局域网使用的,ViewState带来的多余的数据量可以忽略不计了。
asp.net ViewState用法:
ASP.NET中的ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制.在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE._VIEWSTATE中存放了所有控件在ViewState中的状态值.
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能.它的类型是system.Web.UI.StateBag,一个名称/值的对象集合.
当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端.当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值.当然这些全部是由ASP.NET负责的.
定义ViewState属性
Public int PageCount
{
get{return(int)ViewState["PageCount"];}
set{ViewState["PageCount"]=value;}
}
使用ViewState的条件
如果要使用ViewState,则在ASPX页面中必须有一个服务器端窗体标记(<form runat=server>).窗体字段是必需的,这样包含ViewState信息的隐藏字段才能回传给服务器.而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET页面框架才能添加隐藏的字段.
Page的EnableViewState属性值为true.
控件的EnableViewState属性值为true.
提醒:
1.当存在页面回传时,不需要维持控件的值就要把ViewState禁止.
2.ViewState的索引是大小写敏感的.
3.ViewState不是跨页面的.
4.为了能保存在ViewState中,对象必须是可流化或者定义了TypeConverter.
5.控件TextBox的TextMode属性设置为Password时,它的状态将不会被保存在ViewState中,这应该是出于安全性的考虑.
6.在页面没有回传或重定向或在回传中转到(transfer)其他页面时不要使用ViewState.
7.在动态建立控件时要小心它的ViewState.
8.当禁止一个程序的ViewState时,这个程序的所有页面的ViewState也被禁止了.
9.只有当页面回传自身时ViewState才是持续的.
10.将一个页面的控件传输到另外一个页面(第二个页面)时,通常会出现错误。解决方法是在第二个页面中将viewstate禁用。
启用和禁止ViewState
在默认情况下,所有服务器控件的viewstate开启状态,通过以及几种途径来禁止。
1.页面级别
2.控件级别
3.应用程序级别
4.机器级别
页面级别禁止的方法是在页面的开始写入
<%@ Page EnableViewState ="False" %>
or
<%@ Page EnableViewState ="True" %>
控件级别是
<asp:TextBox id="txtCode" runat="server” EnableViewState="false" />
or
<asp:TextBox id="txtCode" runat="server" EnableViewState="true" />
程序级别是在web.config中
<pages enableViewState="false" />
or
<pages enableViewState="true" />
机器级别是在machine.config中
<pages enableViewState="true" enableViewStateMac="true" ... />
or
<pages enableViewState="false" ... />
在viewstate中保存和取出值
viewstate能处理以下的类型
基本类型,基本类型数组,ArrayList 和Hashtable,任何可以序列化的对象。
以下代码是将ArrayList存到viewstate中并取出
ArrayList obj = new ArrayList();
//Some code
ViewState["ViewStateObject"] = obj;
obj = ViewState["ViewStateObject"];
Session,ViewState用法
转载于:https://www.cnblogs.com/zxj159/articles/2428404.html
相关文章:

【HTML】记录自己丢人过程:文本换行缩进都不会
问题描述: html文本想实现换行和缩进,最后气到摔鼠标 换行 实现代码: <br> 直接在文本后加个换行标签即可 缩进 实现代码: style"text-indent: 2em;" 注意:这个属性放到p标签中或者div标签中都…

CentOS5.6系统下mysql5安装
我的系统是CentOS5.6 建议大家完全安装,以免安装时缺少相关的编译器等等。 一、安装mysql(mysql-5.1.50.tar.gz) # tar zxf mysql-5.1.50.tar.gz # cd mysql-5.1.50 #./configure --prefix/usr/local/mysql --sysconfdir/etc --localstated…

CentOS 6.9/7通过yum安装指定版本的JDK/Maven
说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql xxx可以知道全部文件的地方等等。 一、安装JDK(Oracle JDK 1.8) # wget --no-check-certificate --no-cookies --he…

2019牛客全国多校训练三 题解
A Gragh Games Unsolved. B Crazy Binary String 题解:水题,子序列只要统计0和1数量,取最小值然后乘2就是答案; 对于子串:先记录0和1 前缀和的差值,然后找差值相等的距离最远的两个位置即可; 参…

【硬件基础】有源蜂鸣器与无源蜂鸣器
辨别方法 外观: 无源蜂鸣器: 有源蜂鸣器: 注:可以看到底部有绿色电路板的是无源蜂鸣器,底部是黑胶的为有源蜂鸣器 万用表电阻档检测 无源蜂鸣器:发出咔、咔声的且电阻只有8Ω(或16Ω)。 有源…

hdu 1272 小希的迷宫
Problem Description上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B…

技术还是商业重要
在中国IT业创业听得最多的就是,技术不重要,商业和关系才是最重要的。 到了硅谷之后,发现技术气氛十分浓,甚至有朋友说大陆创业比较容易是因为硅谷与之相比,硅谷太注重技术了。 可是慢慢发现其实在硅谷,商业…

bzoj1036: [ZJOI2008]树的统计Count 树链剖分
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的…

cocos lua 加密方案
cocos2d使用的是luajit,lua原生编译出来的bytecode和luajit是不兼容的,所以直接用luac法编译出来的bytecode脚本无法在cocos2d中使用。 目前所指的解决方案有2个: A.luajit加密: 1、官网下载luajit(http://luajit.org/…

VS2010创建ATL类时需要手动填写ProgID
在新建ATL类的时候VS2010默认是不填写ProgID的: 所以默认创建的类生成的rgs文件中只有NoRemove CLSID这一栏,导致在JS中使用new ActivexObject(“LibName.ClassName”)失败。如果想用ActivexObject创建类的话就必须填写ProgID。转载于:https://www.cnblo…

【官网搭建】在网站首页底部添加备案号链接至工信部首页及版权所有。
在网站首页底部添加备案号链接至工信部首页及版权所有。(工信部链接:http://beian.miit.gov.cn或http://www.beian.miit.gov.cn) 在搭建网址的时候你是否受到过这种邮件? 下面提供一个代码模板 <div class"foot_bot&quo…

如何在linux下解压缩rar格式的文件压缩包
前言:没有特殊原因,文档如果要传到linux上,一定要打成*.zip格式, 这样方便解压,一般来说没有理由要用rar.关于 linux上unzip命令有空细讲, 本节讲下,如何让linux支持解压缩rar文件 一 、系统环境…

appium+python自动化45-夜神模拟器连不上(adb server version (36) doesn't match this client (39); killing...)...
前言 最新下了个最新版的夜神模拟器,然后adb devices发现连不上模拟器了,报adb server version (36) doesnt match this client (39); killing... 从报错信息看是adb版本不匹配导致的,接下来讲如何解决这个问题 环境: 夜神模拟器 …

Android.mk文件语法规范
序言: ------------- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C源文件。为了明白下面的内容,你必须已经阅读了docs/OVERVIEW.TXT的内容,它解释了Android.mk文件扮演的角色…

【硬件基础】制作直流电源
要求(其实就是个课设): 利用二极管的基本特性、三极管的基本特性、稳压电源等知识,设计相 应的模拟电路,设计制作放大倍数可变的直流放大器。 任务要求: (1)用集成芯片制作一个 0~1…

RanceQuest2_从委托到Lambda_会用(递归数学函数)
二连发 使用Lambda表达式编写递归函数 ——摘自老赵点滴 - 追求编程之美。 todo用手敲30遍,搞定——泛型委托,Lambda表达式,简单的数学递归。 遗憾的是,原本希望更进一步做出一个通用的递归方法表达式出来,受所学所限&…

[转载].sscanf的用法
原作者不详。 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的&a…

As与强制类型转换的区别以及Is运算符的使用
前言: 开发人员经常需要将一个对象从一个类型转换成其他类型。 在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换 CLR(参考:http://baike.baidu.com/view/605055.htm)允许…

SQL命令执行数据库备份
backup database XXXXX to diskD:\Bak\BACKUP.bak with init XXXXX是数据库名字转载于:https://www.cnblogs.com/lx0831/archive/2009/04/07/1431115.html

【硬件基础】振荡(时钟)周期、状态周期、机械周期、指令周期
前言: 尽管关于单片机的各种周期在网上随便一查就能查到,但于博主个人而言容易搞混,于复习定时器时决定写下这篇博客,相当于一次知识复习总结 振荡(时钟)周期: 以12M的单片机为例,其…

14条改善jquery代码的建议
2019独角兽企业重金招聘Python工程师标准>>> 从国外网站找到的。 http://www.tripwiremagazine.com/ajax/developer-toolbox/more-jquery-and-general-javascript-tips-to-improve-your-code.html 很有用。 转载于:https://my.oschina.net/dlpinghailinfeng/blog/26…

HDFS配额查询
### 查看目录配额 hdfs dfs -count -q -h /user/hive/warehouse/db_name.db ### 查看整个HDFS的空间大小 hdfs dfs -df -h /user/ Filesystem Size Used Available Use% hdfs://hdfs01 10 P 8 P 2 P 80%### 查看指定目录/数据库的大小 hdfs …

# 命令行新建 job 错误: ORA-01008 并非所有变量都已绑定 。
# 命令行新建 job 错误: ORA-01008 并非所有变量都已绑定 。 1、改正前代码: DECLARE job NUMBER; begin sys.dbms_job.submit(job > :job, what > P_AUTO_FETCH_RECORDS;, next_date > to_date(10-05-2011 15:58:35, dd-mm-yyyy hh24:mi:ss), interval > s…

【单片机】以输出方波为例的 定时器使用
实验要求: 利用Proteus软件画出电路图,单片机定时器/计数器以查询方式工作,在P1.0口产生周期为100us的连续方波,在P1.0口线上接上示波器观察波形。 前言:写这篇博客的意义在于,借助本实验可以复习定时器中断…

经典GNA整理
最近学习了各种GAN的结构。在此记录下。 转载于:https://www.cnblogs.com/yeran/p/11251842.html

Global.asax
GlobalFilterCollectionRepresents a classthat contains all the globalfilters.HandleErrorAttributemvc中提供了HandleErrorAttribute特性,该特性用于处理由操作方法引发的异常AreaRegistration.RegisterAllAreas();注册 ASP.NET MVC 应用程序中的所有区域RouteC…

leetcode_1. Two Sum
leetcode_1. Two Sum 前言: 这段时间开始敲leetcode。我认为这并不仅仅只是为了应付笔试,面试。而是确实有着一定的意义。 尤其,你提交代码后,网站会多方面验证你的答案。 另外,提交成功后,你可以查看自己的…

linux ngxtop安装安装及使用
写在前面: ngxtop是Nginx日志实时分析利器 1.下载 下载地址:https://github.com/lebinh/ngxtop 下载zip文件到本地 登录linux服务器,定位到安装目录,执行 rz,选中上一步下载的zip文件,上传完成后执行unzip…

POJ1088(滑雪)
题目链接 动态规划题。 题目大意:给定一个二维数组,数组中每个数代表一个高度,每次只能向相邻且高度下降的方向移动,求最长的移动距离。 View Code 1 #include <stdio.h>2 #include <memory.h>3 #define MAX(a,b) ((…

【硬件基础】个人感悟+C语言 引入头文件时引号括号的区别
前言: 惊!一博主又在水博客 其实不然,单片机从大一下半年就已经开始自学,但是可能是由于高中养成的惰性思维,不愿意思考,只想靠时间来获得内心的满足感:看我今天又学了一天。其实,假…