Delphi XE2 Datasnap会话管理 - 在页面刷新后获取会话信息

6
我正在尝试确定如何使用Delphi REST DataSnap服务器检索会话信息。
我知道,当在同一客户端页面时,您可以使用TDSSession方法GetThreadSession访问当前线程会话。
然而,我想做的是在会话中存储数据(putData),并且仍然能够在用户从page1移动到page2时检索它。目前,如果用户移动到不同的页面,会话将丢失并创建一个新的会话,因此丢失了我之前设置的会话中的数据。
我尝试过使用TDSSessionManager.SetThreadSession(sessionid)进行操作,但似乎无法正常工作。
我已经审查了备受赞誉的Marco Cantu白皮书,但它没有提供解决此问题的方案。
任何帮助都将是极好的,即使只是“嘿,这个主题在X书中有涵盖”。
谢谢!
4个回答

1
你需要调整客户端JavaScript代码,使用cookie来存储会话信息。
请参阅JavaScript客户端会话的最后一部分。
如果您希望保持服务器端对象在会话中处于活动状态,请使用会话生命周期。

为了在页面加载之间记住会话ID,您需要启用会话cookie。例如,调用:initSessionData(true,“chat_”); - Miguel Angel Suarez Rodriguez

1

TDSSessionManager.SetThreadSession(sessionid) 与 Session.sessionname 配合使用。

此外,请确保您的生命周期设置为 Session(如 tondrej 所述)。

如果重新连接客户端,则会启动新会话。因此,您需要保持 Datasnap 连接处于打开状态。

或者,您可以将生命周期设置为 Server 并自行管理客户端会话。

编辑:Rest 服务器是无状态的。因此,您需要在客户端上存储所在页面,并从服务器查询所需页面。


0
在 Datasnap REST(GET、POST、DELETE、PUT)中,如果您将 TDSServerClass 设置为 session,则此时的 REST 类型是无状态的(http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Server_Class_LifeCycle#REST_Clients)。也就是说,您给予各种客户端使用 JSON 等方式来使用您的 datasnap 服务器的机会。
您需要创建您自己的模型来控制 REST 服务器的会话,或者寻找一些框架来完成这个任务。在我的情况下,我使用生命周期服务器上的自定义对象(有时还会涉及数据库),并使用请求头和其他信息上的令牌,以知道是否为同一客户端,并且可以控制令牌何时过期,需要重新登录等。我还可以提供更多的安全性,例如在 PUT 请求中,仅对客户端提供记录(这只是一个案例,但还有其他很多...)。您需要采用其他方式来解决问题,而不是使用经典的 TDSSession 方法。

0

我相信你需要做的是将TDSServerClass实例的LifeCycle属性设置为Session(有状态)。从你的问题中可以看出,你目前正在使用Invocation(无状态)。


抱歉 - 最初提供这些信息会很有帮助。TDSServerClass 的 LifeCycle 属性目前已设置为 Session。 - ConBran
如果HTTP 1.1 KeepAlive连接生效,我认为这应该可以直接使用。 - Ondrej Kelle
1
开箱即用,REST 应用程序使用 TIdHTTPWebBrokerBridge 作为服务器。默认情况下,KeepAlive 属性为“false”,因此,根据您的建议,在启动服务器时,我将 KeepAlive 属性设置为“true”,但不幸的是问题仍然存在。 - ConBran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接