第二十章 CSP Session 管理 - 状态管理
第二十章 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 应用程序中打开或关闭上下文保留。请注意,将进程绑定到一个会话会导致缺乏可伸缩性。

浙公网安备 33010602011771号