第二十章 CSP Session 管理 - 状态管理
状态管理
因为 HTTP
是无状态协议。为 Web
编写的应用程序必须使用特殊技术来管理应用程序上下文或状态。 CSP
提供了许多用于状态管理的机制。这些中的每一个都可能适用于特定情况。
请求之间的跟踪数据
Web
应用程序中状态管理的基本问题是跟踪连续 HTTP
请求之间的信息。有许多可用的技术,包括:
- 使用隐藏的表单字段或
URL
参数在单个页面上存储数据 - 将数据存储在客户端的
cookie
中 - 将数据存储在服务器上的对象中的
%CSP.Session
中 - 在
Caché
数据库中存储数据
在页面中存储数据
要将状态信息存储在页面中,必须放置它以便来自该页面的后续请求包含该信息。
如果页面通过超链接发出请求,则数据应放置在超链接的 URL
中。例如,这是一个包含在 .csp
文件中定义的状态信息的超链接:
<a href="page2.csp?DATA=#(data)#">Page 2</A> 复制代码
当 CSP
为包含此链接的页面提供服务时,表达式 #(data)#
将替换为发送给客户端的文本中的服务器变量 data
的值。当用户选择这个指向 page2.csp
的链接时,CSP
服务器可以通过 %request
对象访问 DATA
的值。如果需要,CSP
可以对此类数据进行编码。
如果页面包含表单,可以将状态信息放置在隐藏字段中:
<form> <input type="HIDDEN" name="DATA" value="#(data)#"> <input type="SUBMIT"> </form> 复制代码
与超链接示例一样,当将此表单发送到客户端时,表达式#(data)#
将替换为变量 data
的值。当用户提交此表单时,可以通过 %request
对象获得 DATA
的值。
要自动将值插入所有链接和表单,请使用 %response.Context
。
在 Cookie
中存储数据
存储状态信息的另一种技术是将其放置在 cookie
中。 cookie
是存储在客户端中的名称-值对。来自客户端的每个后续请求都包含所有先前的 cookie
值。
要设置 cookie
值,请在象中盖 %CSP.Response
中的页面 cookie
值:
Class MyApp.Page Extends %CSP.Page { //... ClassMethod OnPreHTTP() As %Boolean { Do %response.SetCookie("UserName",name) Quit 1 } } 复制代码
服务器稍后可以使用象的 Cookies
属性中的 %CSP.Request
检索此信息。
在 cookie
中存储信息对于希望在会话结束后记住的信息很有用。 (为此,必须设置过期日期,默认情况下,cookie
在浏览器关闭时结束。)例如,可以记住 cookie
中的用户名,以便在后续会话中他们不必重新输入此信息。有关不同类型的 cookie
及其格式的信息,请参阅 HTML
手册。
在Session
中存储数据——数据属性
如前一节所述,可以使用其 Data
属性将会话 %CSP.Session
中的状态信息存储在对象中。放置在 %session
对象中的任何信息都可用于当前会话的剩余部分(或直到它从 %session
对象中删除)。
%session
对象是存储在session
期间有用的简单信息的好地方,例如当前用户的姓名。 %session
对象不适用于必须超出当前session
范围的信息。对于依赖于用户通过应用程序采用的导航路径的信息,它也不是一个好地方。用户通常可以随意随意跳转 Web
应用程序,如果应用程序对用户采用的特定路径做出假设,这可能会导致麻烦。
在数据库中存储数据
如果有更复杂的信息要与用户关联,最好将其存储在内置的 Caché
数据库中。一种方法是在数据库中定义一个或多个持久类,并将它们的对象 ID
值存储在 %session
对象中以供后续访问。
服务器上下文保留 - 保留属性
通常,CSP
服务器从一个请求到下一个请求保留的唯一处理上下文保存在 %session
对象中。 CSP
服务器提供了一种机制来保存整个处理上下文变量、实例化对象、数据库锁、请求之间的打开设备。这称为上下文保留模式。通过在对象 Preserve
属性中设置 %CSP.Session
的值,可以随时在 CSP
应用程序中打开或关闭上下文保留。请注意,将进程绑定到一个会话会导致缺乏可伸缩性。