文章
· 十月 18, 2022 阅读大约需 3 分钟

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

讨论 (0)1
登录或注册以继续