状 态 管 理 • 网站与桌面系统的工作方式不同,与传统的分布式系 统也不相同在桌面系统中,系统资源被独占;在传 统的分布式系统中,资源虽然分布在系统的各个环节 ,但是只要不专门指定,系统总是保持连接的网站 系统虽然也是一个分布式系统,但由于服务器要为众 多的用户服务,浏览器与服务器之间的连接是不连续 的,状态也是不保持的,HTTP是一个无状态的通信 协议这就是说,在网站系统中,每次浏览器与服务 器之间的连接都是暂时的当浏览器与服务器之间的 一次会话结束,它们之间的连接也就自动断开了,下 一次会话与本次连接无关,两次连接之间不存在任何 联系 状 态 管 理 • 为什么不保持状态呢?这是因为访问网站的用户 常常川流不息如果要求系统将所有被访问的网 页的状态都记忆下来,必然会耗费大量的系统资 源,严重地降低程序的运行效率 • 然而,在网站应用中有的状态却是需要保留的, 比如用户在购货车中订购商品、用户登录的身份 、对问卷调查所作的回答等,这些状态中有的希 望能够保留一定的时间,以便联合处理或者在一 定的范围内进行传递和共享状 态 管 理 • 为此,系统提供了状态管理方法,允许有选 择地将一些状态(数据)在一定的时间内持续 地保存下来。
本讲将要介绍几种状态的管理 方法,具体内容包括: • 状态管理 • 视图状态 • 会话状态 • Web窗体页的生命周期状 态 管 理 • 1 状态管理 • 2 视 图 状 态 • 3 会 话 状 态 • 4 简单的应用示例 1 状态管理• 状态管理 • 状态管理的类型 • 服务器端状态管理 • 客户端状态管理 • Global.asax 文件状态管理姓 名 请输入您的 登录信息: John 提交 Chen Web 服务器 Login.aspx Login.aspxWeb 服务器 Hello John Chen Greetings.aspx 请输入您的 登录信息: John 提交 Chen Hello Greetings.aspx 我忘记您了!! 姓 名 无状态管理 有状态管理 状态管理• 有状态与无状态: • 有状态是指在整个系统的处理过程中要保留记住 一些信息,而无状态则相反,它指协议对于事务 处理没有记忆能力,每次请求都是独立的连接, 不需要在每个请求之间共享数据等等 HTTP协 议是无状态协议缺少状态意味着如果后续处理 需要前面的信息,则它必须重传,这样可能导致 每次连接传送的数据量增大。
• 为什么需要使用状态管理?• 需要使用状态管理的场合• 客户端状态是将信息保留在客户端计算 机上,当客户端向服务器端发送请求时 ,状态信息会随之发送到服务器端• 服务器状态是指状态的信息保存于服务 器状态管理状态管理的类型服服务务器端状器端状态态管理管理 客客户户端状端状态态管理管理 应用程序状态 • Web 应用程序的所有用 户都可以访问该 信息 Cookie • 使用文本文件存储信息来 维护状态 会话状态 • 只有特定会话中的用户 可以访问该 信息 视图状态 • 在同一页的多个请求之 间自动保留值 数据库 • 在某些情况中,希望使 用数据库来维护 Web 站点上的状态 查询字符串 • 附加到页的 URL 末尾的 信息 服务器端状态管理• 服务器端状态管理 – 与客户端状态管理相比,具有更高的安全性 – 与客户端状态管理需相比,需要使用更多的 Web 服务器资源 – 可通过应用程序状态(Application)、会话状 态(Session)和数据库保存会话状态来实现Web 服务器 客户端计算机 应用程序和会话变量 SessionID 服务器端状态管理 • 应用程序状态管理 – 使用应用程序状态(HttpApplicationState 类的一个实例 )来保存每个活动 Web 应用程序的值 – 该信息对整个应用程序的所有页面都是可见的 – 使用键/值词典结构存储应用程序变量 – 常用于存储多个会话共享的、不经常改变的信息 • 优点:易于实现、全局范围 • 缺点:全局范围、持久性、资源要求Web 服务器 客户端计算机 应用程序和会话变量 SessionID 服务器端状态管理• 会话状态 – 使用会话状态(HttpSessionState 类的一个实例)保存 每个活动 Web 应用程序会话的值 – 会话状态的范围限于当前的浏览器会话 – 使用键/值词典结构存储会话变量 – 可扩展性较好:可以将会话信息存储在 Cookie 中、进程 外服务器中或 SQL Server 中 – 使用 SessionID 标识不同的会话 • 不同的用户有不同的会话状态,同一用户在退出后返回,也将有 不同的会话状态 • 优点:易于实现、具有会话特定的事件、持久性、 平台可缩放性和可用于不支持 HTTP Cookie 的浏览器 • 缺点:可能降低服务器性能客户端状态管理• 客户端状态管理 – 不如服务器端状态管理选项安全 – 不如服务器端管理选项可靠 – 可存储的信息量可能受到限制 • 使用 Cookie 维护状态 – 持久性 Cookie – 临时性的或非持久性的 Cookie Web 服务器 客户端计算机 Cookie 用户可以删 除 Cookie 恶意的用户可通过某 些方法来“盗取” Cookie 并读取其中的内容 Global.asax 文件• 一个 Web 应用程序只有一个 Global.asax 文件 • 文件驻留在 ASP.NET 的应用程序的虚拟根目录 中 • 用来处理应用程序级事件和会话事件 • Global.asax 文件可选 • 不能直接通过 URL 请求 Global.asax 文件1 状态管理• 本讲介绍以下ASP.NET提供的3种状态类型,分 别应用于不同的目的。
l 视图状态:用于保存本窗体页的状态 l 应用程序状态:用于保存整个应用程序的状态, 状态存储在服务器端 l 会话状态:用于保存单一用户的状态,状态存储 在服务器端 l Cookie状态:用于保存单一用户的状态,状态存 储在浏览器端2 视 图 状 态 • 什么是视图状态?简单地说,视图状态就是本窗 体的状态保持视图状态就是在反复访问本窗体 页的情况下,能够保持状态的连续性• 为什么要保持视图状态?ASP.NET中的事件处理 模型是基于服务器处理事件的,当服务器处理完 事件后通常再次返回到本窗体以便继续后续的操 作如果不保持视图状态,就是说当窗体页返回 时,窗体页中原有的状态(数据)都不再存在,这 种情况下怎样能够继续窗体的操作?2 视 图 状 态 • 下面用一个简单的示例来说明这种情况• 假定向窗体中放入几个HTML控件(浏览器端控件) l 一个Input(Text)控件:用来输入姓名 l 一个Input(Password)控件:用来输入密码 l 一个Input(Text)控件:用来输入数量 l 一个Input(Submit)按钮控件:用来向服务器提交数据l 参见图1 使用HTML控件的示例2 视 图 状 态 2 视 图 状 态 • 这说明在网页中已经自动增加了一个隐含控件, 控件的名字为“__VIEWSTATE”。
由于这个新控件 是隐含控件(type=“hidden”),因此增加它并不会 改变界面上的布局控件中的value属性就是窗体 页中各个控件以及控件中的数据(状态)为了安 全,这些数据经过哈希函数加密,已经变得难以 辨认 • 在处理页面时,页面和控件的当前状态会散列为 一个字符串,并在页面中保存为一个隐藏域或多 个隐藏域当将页面回发到服务器时,页面会在 页面初始化阶段分析视图状态字符串,并还原页 面中的属性信息2 视 图 状 态 • 当提交网页时,浏览器端首先将当前网页 中的各种状态保留到这个字段中,当网页 再次返回到本窗体页时,再自动将把这些 状态反馈给返回的窗体页,也就恢复了窗 体页中各控件的状态 • ViewState 属性提供一个键/值字典对象, 用于保留同一页的多个请求之间的数据 这是页面在客户端与服务器端往返之间保 存页面和控件状态的默认方法 2 视 图 状 态 • 示例:用ViewState属性累计在本表单上按 钮的单击次数 • 源程序:CountViewState.aspx• 示例:利用ViewState变量保存和读取页面 信息 • 源程序:ViewStateSaveRead.aspx2 视 图 状 态 • 视图状态只能在本网页与服务器的往返中保持, 而不能在不同网页之间传递,这是和其他状态所 不同的地方。
在默认情况下几乎所有服务器控件 都具有保持视图状态的功能• 保持视图状态带来了好处,但同时也带来一些新 的矛盾如果控件中包括的数据量很大(例如某控 件内有数百条记录)时,将会延长网页往返时需要 的时间另外,尽管视图状态存储在窗体页的隐 藏域中,并且经过哈希函数的加密处理,但它仍 然有可能被篡改,这就导致了潜在的安全问题• 禁用ViewState:属性EnableViewState 设置为false • 禁止整个网页的ViewState:使用 @Page指令2 视 图 状 态 3 会 话 状 态 u3.1 概述 u3.2 会话状态的保存、启动、管理 u3.3 Session对象事件 u3.3 会话变量存储3.1 概述 • 什么是会话状态?会话状态(Session State)是 为单个用户保留的状态 Session对象用于保 存用户会话所需要的信息,从一个用户访问某 个特定的主页开始,直到用户离开• Session对象是Web应用程序为当前访问该站点 的每个用户会话提供信息用户请求来自网站 的Web页就是一次会话当某一用户第一次请 求某个网站的.aspx文件时,ASP.NET将在服务 器端生成一个SessionID,以标识该用户。
3.1 概述 • 用户在应用程序的页面之间切换时,保存在 Session对象中的变量不会被清除,而用户在应 用程序中访问页面时,这些变量始终存在 • 在网站中,每一个新访问的用户都将产生自己 的会话(Session)对象这个Session对象在服 务器端进行管理,只能为当前访问的用户服务 如果另一位用户也进入网站,他也将拥有自 己的Session对象,两个用户的Session对象之 间即使同名,也不能共享同一个Session对象3.1 概述• ASP.NET用一个唯一的120位Session ID来 标识每一个会话 • 若客户端支持Cookie,ASP.NET会将 Session ID保存到相应的Cookie中;若不支 持,就将Session ID添加到URL中 • Session由System.Web.HttpSessionState类 实现,使用时,常直接通过Page类的 Session属性访问HttpSessionState类的实例 • 在Session对象中存储任何数据类型,包括 用户定义的类和结构HttpSessionState常用的属性、方法和事件表 Contents属性获获取对对当前会话话状态对态对 象的引用。
IsCookieless属性逻辑值逻辑值 ,确定Session ID嵌入在 URL 中还还是存储储在 Cookie中true表示存储储在Cookie中 IsNewSession属性逻辑值逻辑值 ,true表示是与当前请请求一起创创建的 Mode属性获获取当前会话话状态态的模式 SessionID属性获获取会话话的唯一标识标识 ID Timeout属性获获取或设设置会话话状态态持续时间续时间 ,单单位为为分钟钟,默认为认为 20 分钟钟 Abandon方法取消当前会话话 Remove方法删删除会话话状态态集合中的项项 Ses。