第5章-Web应用的状态管理_第1页
第5章-Web应用的状态管理_第2页
第5章-Web应用的状态管理_第3页
第5章-Web应用的状态管理_第4页
第5章-Web应用的状态管理_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

Web应用的状态管理内容Web应用状态概述客户端状态维护技术服务器端状态维护技术HTTP协议——“无状态的协议”Web服务器每分钟对上千个用户进行管理的一种方式就是执行所谓的“无状态”连接。只要有一个希望浏览器返回一个页面、图像或其他资源的请求,就发生以下事情:连接到服务器告诉服务器想要的页面、图像或其他项服务器发送请求资源服务器切断连接,把用户忘得干干净净。ASP.NetWebForm的“连续”和“有状态”的假象ASP.NET的设计者们,从实际访问者的角度重新考虑了这一过程:访问者打开一个页面,点击一个按钮,看到新的画面……这一切似乎都是连续的。状态管理Web应用本质上是无状态的,如需保存状态则需要做状态管理,状态维护是对同一页或不同页的多个请求维护状态和页信息的过程,保持用户信息(状态)的连续性。状态管理状态维护技术视图状态:使用一个或多个隐藏域来保存控件的状态。控件状态:当开发自定义控件时,保存控件的状态数据。隐藏域:标准的HTML隐藏域。Cookie:用于在客户端保存少量的数据。查询字符串:查询字符串是在页URL的结尾附加的信息。应用程序状态:用于保存服务器端的全局应用程序信息。会话状态:保存会话状态信息。配置文件属性:ASP.NET提供了一个称为配置文件属性的功能,可以保存服务器端的全局应用程序信息。客户端状态管理客户端状态管理不如服务器端状态管理选项安全不如服务器端管理选项可靠可存储的信息量可能受到限制用户可以删除Cookie恶意的用户可通过某些方法来篡改或读取其中的内容Web服务器客户端计算机客户端状态信息服务器端状态管理可通过应用程序状态(Application)、会话状态(Session)、配置文件、数据库保存会话状态来实现Web服务器客户端计算机服务器端状态信息SessionID客户端状态维护技术视图状态隐藏域查询字符串Cookie视图状态视图状态概述设置页面是否保留视图状态在配置文件设置是否保留视图状态设置页面是否保留视图状态设置@Page指令或Page的EnableViewState属性指示当前页请求结束时,该页是否保持其视图状态以及它包含的任何服务器控件的视图状态关闭页面的视图状态设置页面是否保留视图状态(例)关闭页面的视图状态<%@PageEnableViewState="false"%>protectedvoidPage_Load(objectsender,EventArgse){Page.EnableViewState=false;}<asp:GridViewID="GridView1"runat="server"EnableViewState="false"></asp:GridView>在配置文件中设置是否保留视图状态在配置文件Web.config的system.web节点下,修改Pages元素的EnableViewState属性,来控制所有页面是否启用视图状态信息<system.web> <!><pagesenableViewState="false"></pages></system.web>对视图状态进行分块设置页的MaxPageStateFieldLength属性,对ViewState属性中存储的数据进行分块,可以在Web.config文件中设置分块大小<pagesenableViewState="true"maxPageStateFieldLength="100"></pages>使用视图状态存取数据

视图状态(ViewState)是一个字典对象,通过Page类的ViewState属性公开,是页用来在往返行程之间保留页和控件属性值的默认方法(只在本页有效)视图状态可存储的数据类型:字符串;整数;布尔值;Array和ArrayList对象;哈希表;自定义类型转换器ViewState["view1"]="HelloWorld";【例5-1】视图状态示例程序。使用视图状态具有以下3个优点:耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。使用视图状态具有以下3个缺点:性能问题。由于视图状态存储在页本身,因此如果存储较大的值,用户显示页和发送页时的速度可能减慢。设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,对于移动设备上的服务器控件,将使用其它的实现方法。潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果在客户端直接查看页源文件,可以看到隐藏域中的信息,这导致潜在的安全性问题。跨页提交PreviousPage使用隐藏域隐藏域是一个存储库,直接存储在页中的任何特定于页的信息,在视图状态、会话状态和Cookie等方法被禁用或不可用,则可以使用HiddenField控件来存储状态值隐藏域的设置和读取<asp:HiddenFieldID="h1"runat="server"/>protectedvoidPage_Load(objectsender,EventArgse){stringstrUserName="Jakey";h1.Value=strUserName;}查询字符串查询字符串提供了一种维护状态信息的方法,输入查询字符串以问号(?)开始的属性/值对,且可以有多个查询字符串,它们之间以“&”分隔/listwidgets.aspx?category=basic&price=100【例5-2】演示查询字符串的使用。使用查询字符串的优点:不需要任何服务器资源。查询字符串包含在对特定URL的HTTP请求中。广泛的支持。几乎所有的浏览器和客户端设备均支持使用查询字符串传递值。实现简单。ASP.NET完全支持查询字符串方法,其中包含了使用HttpRequest对象的Params属性读取查询字符串的方法。使用查询字符串的缺点:潜在的安全性风险。用户可以通过浏览器直接看到查询字符串中的信息。用户可将此URL设置为书签或发送给别的用户,从而通过此URL传递查询字符串中的信息。有限的容量。有些浏览器和客户端设备对URL的长度有2083个字符的限制。CookieCookie概述编写Cookie演示和练习:编写Cookie编写多值Cookie演示和练习:编写多值Cookie控制Cookie的范围演示和练习:控制Cookie的范围修改和删除Cookie演示和练习:删除Cookie和删除多值Cookie的子键Cookie和会话状态Cookie概述Cookie是存储在客户端文件系统的文本文件中,或者存储在客户端浏览器会话的内存中的少量的数据Cookie是随页输出并由服务器发送到客户端的特定于站点的信息Cookie可以是临时的(随着浏览器关闭而自动消失),也可以是永久性的Cookie保存在客户端设备上,当浏览器请求某页时,客户端会将Cookie中的信息连同请求信息一起发送。服务器可以读取Cookie的值Cookie的用途用户的个人配置登录和“rememberme”弹出窗口编写Cookie使用HttpResponse对象来设置Cookie,需要设置Cookie名称、值、过期时间等信息//通过新建HttpCookie对象来添加CookieHttpCookieaCookie=newHttpCookie("lastVisit"); //新建HttpCookie对象aCookie.Value=DateTime.Now.ToString();aCookie.Expires=DateTime.Now.AddDays(1); //设置Cookie的过期Response.Cookies.Add(aCookie); //将Cookie添加到Cookies集合//读取Cookie值stringuserName;if(Request.Cookies["userName"]!=null){userName=Request.Cookies["userName"].Value;}编写多值Cookie在一个Cookie中存储多个名称/值对,名称/值对称为子键//直接添加CookieResponse.Cookies["userInfo"]["userName"]="patrick";Response.Cookies["userInfo"]["lastVisit"]=DateTime.Now.ToString();Response.Cookies["userInfo"].Expires=DateTime.Now.AddDays(1);//读取Cookie值stringuserName;if(Request.Cookies["userName"]!=null){if(Request.Cookies["userInfo"]["userName"]!=null){userName=Request.Cookies["userInfo"]["userName"];}}控制Cookie的范围限制Cookie的域范围将Cookie限制到某个文件夹或应用程序控制Cookie的范围限制Cookie的域范围Response.Cookies["domain"].Value=DateTime.Now.ToString();Response.Cookies["domain"].Expires=DateTime.Now.AddDays(1);Response.Cookies["domain"].Domain="support.";控制Cookie的范围将Cookie限制到某个文件夹或应用程序HttpCookieappCookie=newHttpCookie("AppCookie");appCookie.Value="written"+DateTime.Now.ToString();appCookie.Expires=DateTime.Now.AddDays(1);appCookie.Path="/App1";Response.Cookies.Add(appCookie);修改和删除Cookie由于Cookie存储在客户端,不能直接修改和删除Cookie通过给Cookie赋新值替换旧版本Cookie的办法来修改可以通过设置Cookie立即过期的办法来删除CookieCookie的应用一般只要有会员、用户机制的网站或论坛在登录的时候都会有这么一个复选框——[记住我的名字|两周内不再登录|在此计算机上保存我的信息],说法较多,实现起来差不多,下面就来实现这样一个简单的例子。【例5-3】演示Cookie的使用。服务器端状态维护技术会话状态应用程序状态会话状态会话标识符配置会话状态

会话状态事件会话状态变量的使用

会话状态的利弊

会话状态是ASP.NET中非常重要的服务器端状态管理技术,同时也是功能很强大的状态管理技术。会话状态是特定于用户的,当一个用户开始访问Web应用程序时,将会产生一个会话状态。不同的用户具有不同的会话状态,如果有一万个用户,将会有一万个会话状态。会话状态在存储与用户相关的信息方面非常有用,如博客登录后就可以使用会话状态存储通过验证的用户信息。会话标识符浏览器的会话使用存储在SessionID属性中的唯一标识符进行标识会话ID使ASP.NET应用程序能够将特定的浏览器与Web服务器上相关的会话数据和信息相关联会话ID的值在浏览器和Web服务器间通过Cookie进行传输,如果指定了无Cookie会话,则通过URL进行传输会话标识符无Cookie的SessionID将Web.config文件的sessionState节的cookieless属性设置为true,可以指定不将会话标识符存储在Cookie中,而是存储在URL中<configuration><system.web><sessionStatecookieless="true"/></system.web></configuration>http://localhost:10765/StateManageDemo/(S(hfuvhje2whhmnhyaocja54r0))/Default.aspx会话标识符配置会话状态

会话状态模式概述ASP.NET会话状态支持若干用于会话数据的存储选项在Web.config文件中为sessionState元素的mode属性分配一个SessionStateMode枚举值,可以指定ASP.NET会话状态使用的模式配置会话状态(续)

InProc模式(进程内模式)是默认会话状态模式,使用SessionStateMode枚举的InProc值指定进程内模式将会话状态值和变量存储在本地Web服务器的内存中是唯一支持Session_End事件的模式配置会话状态(续)

StateServer模式(状态服务器模式)会话状态存储在一个称为ASP.NET状态服务的进程中,该进程是独立于ASP.NET辅助进程或IIS应用程序池的单独进程使用此模式可以确保在重新启动Web应用程序时保留会话状态,并使会话状态可用于网络场中的多个Web服务器<configuration><system.web><sessionStatemode="StateServer"stateConnectionString="tcpip=SampleStateServer:42424"cookieless="false"timeout="20"/></system.web></configuration>配置会话状态

(续)

SQLServer模式会话状态存储到一个SQLServer数据库中可以确保在重新启动Web应用程序时保留会话状态,并使会话状态可用于网络场中的多个Web服务器<configuration><system.web><sessionStatemode="SQLServer"sqlConnectionString="IntegratedSecurity=SSPI;datasource=SampleSqlServer;"/></system.web></configuration>配置会话状态(续)

Custom摸式(自定义模式)指定使用自定义会话状态存储提供程序来存储会话状态数据在Web.config中配置sessionState的提供程序为自定义的会话状态存储提供程序Off模式:此模式禁用会话状态。

会话状态事件在Global.asax文件编写用于管理用户会话的事件:Session_Start事件:在新会话开始时触发Session_End事件:在会话被放弃或过期时触发Session_Start事件:通过向Global.asax文件添加一个名为Session_Start的事件过程来处理。如果请求开始一个新会话,Session_Start事件过程会在请求开始时运行。如果请求不包含SessionID值或请求所包含的SessionID属性引用一个已过期的会话,则会开始一个新会话。可以使用Session_Start事件初始化会话变量并跟踪与会话相关的信息。Session_End事件:通过向Global.asax文件添加一个名为Session_End的事件过程来处理。Session_End事件过程在调用Abandon方法或会话过期时运行。如果超过了某一会话Timeout属性指定的分钟数并且在此期间内没有请求该会话,则该会话过期。会话状态变量的使用

向会话状态添加项以键/值对形式直接向Session中添加项以持久保留值,并且根据添加的键名称访问会话状态的值//添加 Session["UserName"]="mary";或: Session.Add("UserName","mary");//访问If(Session["UserName"]!=null){stringstrUsername=Session["UserName"].ToString();}会话状态变量的使用会话的过期配置会话过期时间,默认过期时间为20分钟编写代码设置Session对象的Timeout属性,来设置会话状态过期时间voidSession_Start(objectsender,EventArgse){Session.Timeout=30;}<configuration><system.web><sessionStatemode="InProc"timeout="30"/></system.web></configuration>使用会话状态删除会话状态中的项调用Session对象的Clear和RemoveAll方法来删除会话状态集合中的所有项调用Remove和RemoveAt删除其中的某一项调用Abandon方法取消当前会话,即会话立即过期Session.Remove("UserName");Session.Abandon();【例5-4】演示会话状态变量的使用。会话状态的利弊

使用会话状态的优点:实现简单。会话特定的事件。数据持久性。平台可伸缩性。无需Cookie支持。可扩展性。使用会话状态的缺点:使用会话状态时,要注意其性能问题。

应用程序状态应用程序状态概述添加和读取应用程序状态中的值演示和练习:使用应用程序状态来存储信息删除应用程序状态的值应用程序状态概述应用程序状态是一种全局存储机制,可以供Web应用程序中的所有页面(或Global.asax文件)访问存储在HttpApplicationState类的实例中,该类在客户端第一次从某个特

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论