Web上的状态管理

web

     在前面的章节中介绍了ASP提供的访问一个客户请求和产生响应的方法,本章将讨论ASP的另两个对象。就是Application和Session对象。这两个对象不是直接地与请求和响应的管理有关,而是更多地与ASP网页运行环境的管理相关。
     与建立Web站点或Web应用程序有关的共同问题之一,是使用HTTP协议时没有状态。状态提供了与一个指定用户有关的变量值、对象和其他资源,并且应用程序中的任意例程都能使用它;以一种像VB或C++这样的程序设计语言编写一般的基于客户的应用程序时,使用状态可以完成一些相应的工作。然而,Web并不提供这种能力。在本章中,读者将看到为什么和如何避免这个问题。
     本章还涉及到一些术语和技术问题。它迄今为止,本书中已经简单地讨论了“Web应用程序”,但没有真正确切地理解或准确定义它们到底是什么。本书也涉及到了“用户会话”,也没有相应的比较完全的描述。前面有意地省略这方面的内容,因为它们与ASP的应用程序和会话密切相关。下面将介绍ASP的Application和Session对象。
     本章研究的主要内容:
     · Web应用程序是什么,以及它们如何与ASP Application对象相联系。
     · ASP如何自动地创建和管理应用程序和会话。
     · Application和Session对象提供的功能。
     · 如何把Application和Seesion对象放入ASP网页中。
     首先研究整个内容的核心问题:状态。

     3.1 Web上的状态管理
     许多开发人员把应用程序传送到Web之前从来没考虑状态的概念。正如前面说过的,Web是一个无状态的环境。因此应该探讨一下状态是什么,了解能够避免产生问题的方法。

     3.1.1状态的准确定义
     在单用户程序中,创建一个可执行的应用程序时,例如使用VB建立一个.exe文件,可以声明一个全局(或Public)变量,然后在代码中任何地方可对其进行访问。在应用程序运行的所有时刻,时刻值一直是有效,并且是可访问的。
     对于一个传统的客户机/服务器解决方案,例如一个基于客户机的应用程序对一个基于服务器的数据库引擎进行访问的系统,每个客户端建立了一个与服务器和数据库应用程序的连接。这种连接通常是通过验证用户的方法来建立的。
     验证过程是典型的识别用户身份的过程,通过一个用户名和口令组合来证明是否为合法的用户。
     一旦通过验证,在客户端和基于服务器的应用程序之间就建立了连接,该连接在用户使用该应用程序的所有时间内一直保持有效。当用户注册到酵Windows 2000服务器上时,这一切便会发生。无论何时,管理员使用“Active Directory Users and Computers”实用程序(单击“Start”菜单的“Administrative Tools”选项中的“Directory Management”项)都可以观察到活动的用户连接。这个过程在许多系统中都相同,例如Microsoft SQL Server。
     这种永久的连接意味着:当用户发送指令或请求到服务器上时,服务器会很容易地识别每个用户。同样服务器的响应或任何其他用户的信息也能直接返回用户。要进一步指出的是服务器可以比较容易地存储与每个客户相关的值和信息,并在需要的时候提供给相应的客户。当然,服务器应用程序能够拥有主全局变量,以便于用户在需要的时候进行访问。
     这种识别每个客户端的请求并在内存中保存相关用户的值的能力构成状态。可以认为状态代表应用程序的值、环境以及用户的内部变量,并贯穿于应用程序和用户连接的整个过程。

     3.1.2 状态的重要性
     如果打算创建与用户进行交互的基于Web站点的应用程序,而不是仅显示独立页面的Web网站,必须能够为每个用户提供独立的状态。这可能只是记住他们的名字,也可能要为每个用户存储对象引用或不同的记录集。如果不能这样做,ASP网页就不能做更多的事情,因为该页面执行完成时,页面中的变量和其他相关资料都破坏了。录用户请求下一个页面时,这个页面提供的所有信息将全部失去。
     因此,需要找到一种方法,保存每个访问者的状态。能够存储对所有用户而言的全局值是非常重要。例如,一个Web风格的访问或页面点击计数器,它不为每个用户提供自己的计数器,用户们通常想要看到访问者的总数,而不仅仅是他们自己访问的次数。访问者的数目需要与应用程序级状态一起存储,而不是与用户级状态一起存储。
     这不是一个刚出现的问题,自从商用站点占据了Web,就已经存在,甚至更早些。所以已有许多在Web上存储状态的传统的解决方案。Web站点管理员想要了解访问者以前是否曾访问过他们的网站,如果访问过,访问过多少次?还定期访问其他什么网站等。这样可以更好地制定其广告目标。所有这些都要求一种方法来存储有关用户在访问时所产生的网页请求或每次访问间的信息。

     3.1.3在Web上创建状态
     在页面请求和站点访问之间提供状态常用的方法是通过cookie。我们在前面的章节中已经看到,如何在客户端的计算机中存放相应的值,这些值与每个页面请求一起发送给对此cookie有效的域。通过用ASP检查和更新cookie,在某种程度上能够保持一个状态。可以使用所包含的信息来识别用户,然后把用户连接到一个已存储相应值的集合。
     例如,可以检测一个用户请求是否包含一个站点指定的cookie。如果不包含,则为该用户分配一个某种类型的标识,指明一个数量,并存储在带有一个长有效期的cookie中。以后该用户对这个站点的每一次访问,都能够检测到cookie并更新所包含的信息。同时可以收集有关访问的次数和持续时间的数据,并存储在服务器上,以备将来使用。
     但是,如果用户转移到另一个计算机,或删除了cookie,或者他们的浏览器拒绝接收发送给他们的cookie,会发生什么事情呢?在这种情况下,不能维持状态,因为下一次不能识别他们现在,Web上有许多cookie,大多数人会接受它们,而不加理会。如果打开浏览器中的“Warn before accepting cookies”选项,接着漫游几个大的站点,你就会明白其中的含意。
     1. 匿名访问者与授权的访问者
     如果认为cookie是一个有点草率的解决方案,可以使用更直接的方法。许多站点采用的一种方法是,在访问者点击一个站点时,或者点击一个要求验证身份的页面时,弹出一个进行登录的对话框。访问者首先必须进行注册,获得一个某种类型的用户名/口令的组合,才能允许访问相应的站点或页面。
     为了证实访问者是一个已知的并且合法的用户,在访问者的计算机上放置的一个cookie,它或者保存注册的详细数据,或者是一把表明已验证过身份的“钥匙(key)”。同时,访问者的详细数据永久地保存在服务器上,准备再次访问时使用。如果访问者的浏览器中有了这样一个cookie,他就可以自由地访问该网站,因为已经验证过了。
     如果cookie没有有效期限(Expires),cookie的值在关闭浏览器时自动消失,在下一次访问时必须重新注册和再次验证。当然,如果拒绝接收cookie或删除了cookie,就只能再次得到注册对话框。这样的话,如果不被识别,就不能访问该站点。
     通过强制用户就像注册到自己的网络一样注册到Web服务器,Windows 2000整体安全性能为IIS提供更强和更安全的验证功能。但是,这只能与Internet Explorer 3.0和之上版本的浏览器一起工作。IIS也可以使用BASIC验证允许非Microsoft浏览器注册Web服务器。
     2. 不再有匿名访问者
     在IIS Web服务器上使用ASP时,除非用户离开该站点到另一个网站或者关闭了浏览器,否则能在当前会话中跟踪用户。在本章的后面,将看到如何使用这个功能来标识一个访问者、存储用户的本地信息和提供状态。下面与已经讨论过的解决方案相比较,讨论其工作方式。
     ASP和IIS共同提出了一个用户会话的概念,通过ASP Session对象进行交互。在每个访问者第一次访问服务器上的一个ASP网页时,为他创建一个新的并且独立的会话对象,分配给该会话一个会话标识号,并把包含会话标识符的特殊加密版本的一个cookie发送给客户。
cookie的路径(参看前面的章节有关cookie属性的描述)设置为运行在服务器上的ASP应用程序的根路径。这很可能上缺省的Web网站的根目录(即“/”),但也可能会是另外一个值(稍后会看到)。在cookie中没有提供Expires值,所以当浏览器关闭时,cookie值也就消失。
     每当这个用户访问这个ASP网页,ASP都会查找这个cookie。命名为ASPSESSIONIDxxxxxxxx,其中每个x是一个字母字符。从第2章图2-7所示的ServerVariables集合,能够在HTTP报头中看到它。这里高亮地显示ASP cookie,如图3-1所示:

    但是,这个cookie不会出现在 Request.Cookies或Response.Cookies集合中,ASP把它隐藏起来,但仍保存在浏览器上。对于每个ASP网页请求,ASP都要查看该值。这个cookie包含的值,指明了这个用户的会话。因此,相应的Session对象(该对象在内存中已被处理,并且一直包含所有在前一页面请求过程中进行操作的值)的内容可以移交给ASP网页中的脚本。
     当然,如前所述,如果客户浏览器不接收或不支持这些cookie,这个处理将失败。在这种情况下,不能创建ASP会话,对这个访问者的状态也不进行自动维护。

时间: 2024-10-03 05:26:34

Web上的状态管理的相关文章

ASP.NET:掌握Web窗体的生命周期与状态管理

asp.net|web 如果你具有使用 Active Server Pages (ASP) 的经验,你将认识到 ASP 是线性处理模型.ASP 页是按从上到下的顺序处理的.ASP 代码和静态 HTML 的每一行都按其在文件中的显示顺序进行处理.在往返行程中用户操作导致页被发送到服务器.因为此操作导致往返行程,所以服务器必须重新创建该页.在重新创建该页后,将通过与以前相同的从上到下的顺序对该页进行处理,因此,该页未表现出真正的事件驱动行为.若要创建事件驱动体验,你需要显式设计它.此外,你必须在最基

掌握Web窗体的生命周期与状态管理

web     如果你具有使用 Active Server Pages (ASP) 的经验,你将认识到 ASP 是线性处理模型.ASP 页是按从上到下的顺序处理的.ASP 代码和静态 HTML 的每一行都按其在文件中的显示顺序进行处理.在往返行程中用户操作导致页被发送到服务器.因为此操作导致往返行程,所以服务器必须重新创建该页.在重新创建该页后,将通过与以前相同的从上到下的顺序对该页进行处理,因此,该页未表现出真正的事件驱动行为.若要创建事件驱动体验,你需要显式设计它.此外,你必须在最基本的级别

ASP应用程序设计的Web状态管理分析

web|程序|设计     许多开发人员把应用程序传送到Web之前从来没考虑状态的概念.正如前面说过的,Web是一个无状态的环境.因此应该探讨一下状态是什么,了解能够避免产生问题的方法. 状态的准确定义 在单用户程序中,创建一个可执行的应用程序时,例如使用VB建立一个.exe文件,可以声明一个全局(或Public)变量,然后在代码中任何地方可对其进行访问.在应用程序运行的所有时刻,时刻值一直是有效,并且是可访问的. 对于一个传统的客户机/服务器解决方案,例如一个基于客户机的应用程序对一个基于服务

WEB SERVICES状态管理

services|web WEB SERVICES状态管理 在默认情况下,.NET下的WEB SERVICES是无状态的.不过可以用ASP.NET提供的状态管理那就是SESSION和APPLICATION.这使得WEB SERVICES下状态管理变得简单了,只需使用WEBMETHOD属性的ENABLESESSION子属性就可[WEBMETHOD(ENABLESESSION=TRUE)] 服务端代码如下:[WebMethod(EnableSession= true)] public client

免费php/mysql无限空间支持ftp/web上传管理

免费PHP/MySQL空间,200M/支持FTP 流量限制为:5,000MB : 支持FTP/WEB方式上传与管理文件 : 可以绑定域名或者使用他们官方赠送的二级域名 : 支持PHP5,并且提供MySQL数据库 : P4Web免费空间地址:http://www.p4web.biz/ 支持FTP免费PHP空间 5G空间 大小为:5000MB: 月流量限制为:20GB: 支持PHP5.MySQL,并且可以通过PhpMyAdmin管理数据库 申请地址:http://www.cedhost.com/ 无

ASP.NET中的状态管理

asp.net 我们在ASP中能够通过cookie.查询字符串.应用程序.对话等轻易地解决这些问题.现在到了ASP.NET环境中,我们仍然可以使用这些功能,只是它们的种类更多了,功能也更强大了. 管理互联网网页主要有二种不同的方法:客户端和服务器端. 1.客户端的状态管理: 在客户端.服务器之间的多次请求-应答期间,服务器上不保存信息,信息将被存储在网页或用户的计算机上. A.Cookie cookie是存储在客户端文件系统的文本文件中或客户端浏览器对话的内存中的少量数据,它主要用来跟踪数据设置

你会做Web上的用户登录功能吗?

  Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录功能.以下内容,转载时请保持原文一致,并请注明作者和出处 . 用户名和口令 首先,我们先来说说用户名和口令的事.这并不是本站第一次谈论这个事了.如何管理自己的口令让你知道怎么管理自己的口令,破解你的口令让你知道在现

ASP.NET2.0服务器控件之自定义状态管理

asp.net|服务器|控件 在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化

ASP.NET 中 Session 实现原理浅析 [2] 状态管理器

asp.net|session 状态管理本来是一件很美好的事情,嘿嘿,只可惜总是有些厂商在实现的时候考虑得不那么周全.例如 MS 在 ASP 中的状态管理实现就比较烂,因为只实现了一个进程内的基于内存的状态管理,故而存在很多问题: 1.所有的 Session 数据都保存在 Web 服务的进程中,会造成服务器支持会话数量受到服务器内存资源的限制问题,同时也因为大量非活动会话导致内存被无效占用. 2.服务器进程崩溃会导致所有的会话数据丢失. 3.会话无法跨进程或在负载均衡情况下使用,除非负载均衡技术