ASP.NET中的状态(信息)保持方案: 客户端的状态保持方案:ViewState(隐藏域保存客户端单独使用的数据,只有当前页面可以使用) Cookies(保存客户端单独使用的数据,当前客户端任何页面都可以访问)控件状态、URL查询参数 服务端的状态保持方案:Session(会话)、Application、Caching(缓存)、DataBase(数据库) ------------------------------------------------- ViewState: ASP.NET 的 .aspx页面特有,页面级的; 就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式; 非单值的服务器端控件的值都自动保存在ViewState中; 其内存储的对象必须被序列化 Cookie: HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息; 就是在客户端保存客户端单独使用的数据的一种方式; 就像你的病历本一样,医院直接给你带回家; Session:现在指的是进程内Session。 在服务器端保存客户端单独使用的数据的一种方式; 就像银行账户,钱都存在银行里,你就拿一张银行卡(SessionId)回家; Application: 在服务器端保存共享数据的一种方式; 就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开; ---------------------------------------------------------------------------------------------------------- 1.ViewState (页面级) 使用ViewState可以方便的在服务器端将数据输出保存到客户端页面的一个隐藏域中 先序列化 再base64编码 自动保存到页面隐藏域 隐藏域中的数据给服务器 根据 两种使用方式: 作用域---页面级 1.用户数据保存方式: ViewState["myKey"]="MyData"; 读取数据方式: string myData; if(ViewState["myKey"]!=null) { myData=(string)ViewState["myKey"]; } 注意:ViewState不能存储所有的数据类型,仅支持可序列化对象。
2.非单值服务器控件的状态也自动保存在ViewState中 列入:下拉框。textboX(文本框是单值控件,所以不会保存在ViewState中)
a.使用ViewState的前提: 页面上必须有一个服务器端窗体标记(<form runat=“server”>) b.服务器在接收到用户请求一个页面后,会自动在请求报文中找看是否包含__VIEWSTATE的隐藏 域,如果有,则将隐藏域中ViewState中的值经过反序列化,base64解码后添加到页面的ViewState属性以及服务器控件value中。 c.服务器在输出的时候,也会自动的将ViewState中的值序列化为字符串形式,再经过base64编码后 添加到表单里名叫__VIEWSTATE的隐藏域中 VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器交互
2.在页面生命周期中ViewState的内部实现原理: LoadState : 获得表单提交过来的隐藏域_VIEWSTATE里的值,从中找出 1.属于服务器控件的值,然后赋给控件树里对应的控件属性 2.属于用户通过VIEWSTATE["key"]=value方式添加的值, 并赋给页面对象的VIEWSTATE属性
将VIEWSTATE中的值已经还原到 VIEWSTATE属性中 Page_Load : 用户可能要从页面VIEWSTATE属性中获取之前保存的键值对, 所以在Page_Load之前,必须将表单隐藏域里的值还原到页面VIEWSTATE 属性中 SaveState : 遍历控件树所有的控件,然后将需要保存的属性和数据以及控件名称, 保存到VIEWSTATE中
RenderControl() : Render时,要遍历控件树,调用每个控件的Render方法,从而生成整个页面的html代码 但当它执行到HtmlForm表单控件的时候,此控件的Render方法里会读取VIEWSTATE 里的每个键值对,并将他们序列化成字符串,然后进行base64编码得到一个新的字符串 最终生成一个<input type="hidden" name="__VIEWSTATE" />的隐藏域的value中.
缺点:加大网站的流量、降低访问速度、机密数据放到表单中会有数据欺骗等安全性问题。 故事:自行打印存折,因为余额不是写到存折这个隐藏字段中的,唯一的关联就是卡号。要把机密数据放到服务器,并且区别不同的访问者的私密区域,那么就要一个唯一的标识。 跨页面提交的__VIEWSTATE不会被目标页面装入页面的ViewState属性中 查看生成的源代码,ASP.Net将所有隐藏内容统一放到了名字为__VIEWSTATE的隐藏字段中, 使用序列化算法将所有隐藏内容放到一个字符串中。点击几次在使用ViewStateDecoder这个工具查看ViewState内容,发现了确实将这些改变的内容放到了ViewState中。存储非表单域、非value值的容器。
ViewState的禁用:(重要) 禁用ViewState的方法: 禁用单个控件的ViewState设定enableviewstate=false, 禁用ViewState以后TextBox版本不受影响,Div版本受影响, 因为input的value不依靠ViewState。 禁用整个页面的ViewState的方法: 在aspx的Page指令区加上EnableViewState="false" 。 内网系统、互联网的后台可以尽情的用ViewState。 当某些控件的某些属性不属于浏览器表单的提交范围时,fw将会把这些属性添加到ViewState中保存。 WebForm的IsPostBack依赖于__ViewState ------------------------------------------------------------------------------------------------------------
二.Cookie(小甜饼)--病历本: 1.Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。 当你浏览某网站时,由Web服务器放置于你硬盘上的一个非常小的Cookie文本文件, 它可以记录你的用户ID,浏览过的网页或者停留的时间等网站想要你保存的信息。 当你再次通过浏览器访问该网站时,浏览器会自动将属于该网站的Cookie发送到服务器去, 服务器通过读取Cookie,得知你的相关信息,就可以做出相应的动作。 如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。 2.浏览器访问一个站点时,只将属于当前站点的Cookie发送到服务器。 (根据域名)—(没必要把每家医院的病历本都带过去。)
3.Cookie不兼容浏览器!(不同浏览器不共享Cookie文件数据) 4.最好是将要保存的内容在服务器端加密,然后再写入cookie? 5.在硬盘中存放的位置与使用的操作系统和浏览器密切相关。 6.浏览器保存Cookie有两种方式: 1—浏览器的内存中; 2—浏览器所在的电脑的硬盘中。 为将要写入到浏览器的Cookie对象设置失效时间(cookie写入硬盘中,失效后由浏览器删除): cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效 开发场景:常用于登录和保存用户最近浏览商品 从浏览器发来的Cookie的Expires属性值是无效的. (浏览器在向服务器发送Cookie的时候,没有将Cookie的失效时间发送过去)
-------------------------------------- 7.登陆浏览页面Cookie产生保存的过程: -------------------------------------- 请求由上至下: 第一次访问网站,请求cookLogin.aspx页面,服务器将页面的执行结果(html+css+js)发回到浏览器。浏览器翻译执行html+css+js,用户看到界面。 第二次当用户点击登录按钮,将用户名密码提交到服务器后,服务器验证通过,并讲用户ID存入一个Cookie对象,最后将Cookie对象随响应信息一同发回浏览器。浏览器根据情况储存cookie文本。 第三次当用户访问该网站任何页面时,浏览器会自动根据域名将cookie信息一同发往服务器。(注意:浏览器自动完成此操作)
8.Cookie的操作: 服务器设置Cookie: HttpCookie cok = new HttpCookie(“uId”, “10001”);//(“键”,”值”) cok.Expires = DateTime.Now.AddDays(18);//设置失效日期-现在之后的18天后 context.Response.Cookies.Add(cok); //添加到响应中
服务器获得客户端传来的Cookie: string strUName=context.Request.Cookies[“uId”].Value;//从请求中获得Cookie
9.Cookie原理 --具体如何往返的? 1.1.普通GET请求: 无Cookie,根据隐藏字段判断用户是否提交表单登陆,将登陆页面的页面返回给浏览器 1.2.当用户添加账号密码点击表单登陆后, 服务器通过响应报文头里的set-cookie向浏览器设置Cookie信息 1.3.浏览器通过请求报文头里的Cookie传递浏览器存储的Cookie信息
了解Cookie在请求与相应报文的设置: * 服务器向浏览器写出Cookie实际上就是在 响应报文中 生成响应行: * Set-Cookie: uinfo2=123; expires=Mon, 06-Jun-2011 06:48:47 GMT; path=/ * 浏览器读取此 响应行后 会自动在客户端硬盘中产生一个Cookie文件,名为: * Cookie:administrator@localhost/,注意@后的 localhoust/ ,实际上是颁发此Cookie网站的域名; * 当浏览器下次再访问此域名时,就会自动将 后缀为 localhoust/ 的cookie文件内容发送到服务器。
10.删除Cookie 删除浏览器Cookie 创建一个cookie 与登录时的cookie名相同 HttpCookie cookie=new HttpCookie("id"," "); cookie.Expires.AddDay(-2);//设置失效时间 当前时间-2天 Context.Response.Cookies.Add(cookie);
11.Cookie注意: 表单是和页面相关的,只有浏览器端提交了这些数据,服务器端才能得到。 而有时候希望在服务端任意的地方存取一些和访问者相关的信息, 这时候就不方便将这些信息保存到表单中了,因为如果那样的话必须随时 注意在所有页面表单中都保存这些信息。 Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外, 还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的, 而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器, 并且将服务端返回的Cookie更新到硬盘,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以。 哪怕请求jpg、js、css这种文件也会带着Cookie,因为服务器端可能要进行Session的操作,比如判断是否登录。互联网优化的案例:图片服务器和主站域名不一样,降低Cookie流量的传输。面试时聊网站调优 Cookie的缺点和表单一样,而且还不能存储过多信息。客户端、服务器端设置的Cookie双方都能读。
------------------------------------------------------------------------------------------------------------------- 三.Session Session提供了一种把信息保存在服务器内存中的一种方式.它能存储任何数据类型包括自定义对象。 Session存在于上下文对象Context中, 在服务端存一个Session键值对 Session 对象用于存储有关用户的信息。每个客户端的Session是独立存储。 在整个用户会话过程中(浏览器关闭之前)都会保留此信息.(保存SessionId的cookie丢失之前) 当用户在应用程序中从一个网页浏览到另一个网页时,存储在 Session 对象中的变量不会被丢弃。 Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了) 用户不能访问或修改他人的Session
注意:当会话(Session)过期或终止时,服务器就会清除 Session 对象
Session原理: 5.1 Session["id"]=strName; 向服务器Session池添加Session对象,将键值对存入Session对象中 同时以cookie方式向浏览器发送SessionId. 5.2在浏览器未关闭的前提下,当再次访问该网站页面时, 浏览器会自动将保存了SessionId的cookie发送到服务器来 5.3在调用页面对象的ProcessRequest方法之前,也就是请求管道的第八个事件, 先尝试将页面类对象转换成IRequiresSessionState接口对象,如果转换失败,则不加载Session对象 如果转换成功,服务器端会根据请求报文头中的Cookie里的SessionId到Session池中去找 看是否有对应的Session对象,并且将该对象的引用设置给HttpContext里的Session属性 5.4页面对象执行PR方法时,就直接通过Page类的Session属性 可以访问到HttpContext里的Session引用. Session操作: 销毁(取消/退出) : 1.Session.Abandon();销毁服务端的Session 一般处理程序中访问Session对象时,必须实现IRequiresSessionState接口 标志要求使用Session状态 2.Session.Clear();//清空服务端的Session对象里的键值对,Session对象并没有从Session池里销毁
Session常用属性: SessionID:唯一用户会话标识符 TimeOut:用户超时,默认为20分钟 Count: Session池中 Session对象中 键值对的对数. 注意: 1.ASP.Net已经内置了Session机制.不要放太多的对象到Session(因为存储在服务器端fw的一个辅助进程里,不稳定,数据多了容易丢失。),Session会有超时销毁的机制。
2.Cookie是存在客户端,Session是存在服务器端. 目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie)。
3如果浏览器禁用了Cookie可以启用Url来传递SessionID。
4Session有自动销毁机制(设置失效时间,默认就是滑动过期机制), 如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁。
比较: cookie session都保存当前用户的信息,当前用户的所有页面都可以共享cookie session的数据 -------------------------------------------------------------------------------------- 四.Application对象 Application对象可以存储应用程序级的数据。 “Application”:应用程序 第一个用户访问站点时,应用程序启动,并创建一个Application对象。 创建成功后,整个应用程序中都可以使用该对象。 除非应用程序关闭,否则对象一直存储在内存中。 2.Application (服务器端一个共享的字典集合对象,每个浏览器都可以访问这个对象,操作的是同一个Application) 网站应用程序发布后,当第一个用户访问某一个页面的同时 就创建了一个Application对象(public static Dictionary <string,object>) 加锁:Application.Lock(); 解锁:Application.Unlock();
五.系统对象 系统对象 ASP.NET Request对象 读取客户端在Web请求期间发送的值 Response 对象 封装了页面执行期返回到HTTP客户端的输出 Application对象 作用于整个程序运行期的状态对象(保存网站共享数据) Session 对象 会话期状态保持对象,用于跟踪单一用户的会话 (安全) Cookie 对象 客户端保持会话信息的一种方式(相对类说对安全要求不高的时候使用) Server 对象 提供对服务器上的方法和属性的访问