管理会话
成功开发 Web 应用程序的难题之一便是:当用户从应用程序中的一页转到另一页时,要维护整个访问或“会话”期间的用户信息。HTTP 是非状态协议,也就是说 Web 服务器将每个网页请求都当作独立的请求,服务器不保留以前请求的任何信息,即使它们只早于当前请求几秒钟。这种无法记忆先前请求的缺陷使得编写应用程序很困难,比如编写联机目录,应用程序可能要跟踪当用户在目录中不同页间跳转时所选的目录项目。
ASP 为管理会话信息问题提供了独特的解决方案。使用 ASP Session 对象和服务器生成的特定用户 ID,可以创建更聪明的应用程序,以便标识每次访问的用户并收集信息,应用程序随后就可以利用这些信息来跟踪用户喜好或选择。
要点 ASP 通过 HTTP cookie 指派用户 ID,cookie 是存储在用户浏览器中的小文件。因此,如果正在为不支持 cookie 的浏览器创建应用程序,或者如果用户浏览器设置为拒绝 cookie,则不要使用 ASP 的会话管理功能。
启动和结束会话
会话有四种开始方式:
新用户请求的 URL 标识应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。
用户保留有“Session”对象中的值。
只要服务器收到的请求中不包含有效的 SessionID cookie,就将自动启动新会话。
用户请求应用程序中的 .asp 文件,并且应用程序的 Global.asa 文件使用 <OBJECT> 标记在会话间实例化对象。关于使用<OBJECT> 标记来创建对象实例的详细信息,请参阅使用组件和对象。
如果用户在指定时间间隔内没有请求或刷新应用程序中的网页,会话将自动结束。默认情况下该值为 20 分钟。可以通过设置 Internet 信息服务管理单元“应用程序选项”属性页中的会话超时。 该值的设置取决于 Web 应用程序的要求以及服务器的内存容量。例如,如果希望浏览 Web 应用程序的用户在每页上只停留几分钟,则可以使会话超时值远低于默认值。会话超时过长可能导致打开的会话太多,这将增加服务器内存资源的负担。
对于特定会话,如果要设置低于默认应用程序超时的超时间隔,也可以设置“Session”对象的“Timeout”属性。例如,下面脚本设置的超时间隔为 5 分钟。
<% Session.Timeout = 5 %>
也可以使超时间隔大于默认值,该值由“会话超时”属性决定。
注意“Timeout”只适用于具有状态的会话。在“无状态会话”期间,“Session”对象不包含内容或静态对象。此类会话在请求处理完毕后自动结束,并当收到同一浏览器的下一个请求时重新创建。
另外,如确实希望结束会话,可以使用“Session”对象的 Abandon 方法。例如,可以在窗体中提供“退出”按钮,在该窗体中对包含下列命令的 .asp 文件 URL 设置 ACTION 参数。
<% Session.Abandon %>
注意 如果排队等待执行的用户请求优先于初始化 Session.Abandon,则这些请求将在所要放弃会话的环境中执行。当 Session.Abandon 执行完毕后,新收到的请求不与该会话相关联。
关于 SessionID 和 Cookies
用户第一次请求特定应用程序内的 .asp 文件时,ASP 将生成一个“SessionID”。这是通过复杂算法产生的数值,SessionID 唯一标识每个用户的会话。新会话开始时,服务器将 Session ID 作为 cookie 存储到用户 Web 浏览器中。
SessionID cookie 类似于小橱柜钥匙,当用户在会话期间与应用程序交互时,ASP 可以将用户信息储存到服务器上的“小橱柜”内。用户 SessionID cookie(在 HTTP 请求头文件内传送)同意以小橱柜钥匙允许访问小橱柜内容的方式访问该。ASP 每次收到网页请求时,都检查 HTTP 请求头文件内的 SessionID cookie。
将 SessionID cookie 存储到用户浏览器后,即使用户请求其他 .asp 文件或请求在其他应用程序中运行的 .asp 文件,ASP 也会重复使用同一 cookie 来跟踪会话。同样,如果用户主动放弃会话或放任会话超时,然后继续请求其他 .asp 文件,ASP 仍旧使用同一 cookie 开始新会话。用户收到新 SessionID cookie 的唯一机会就是,服务器管理员重新启动服务器从而清除存储在内存中的 SessionID 设置,或者用户重新启动 Web 浏览器。