6

我正在尝试确定如何使用 Delphi REST DataSnap 服务器检索会话信息。

我知道,当在同一个客户端页面上时,您可以使用 TDSSession 方法 GetThreadSession 访问当前线程会话。

但是,我想要做的是将数据存储在会话 (putData) 中,并且当用户从 page1 移动到 page2 时仍然能够检索它。目前,如果用户移动到不同的页面,会话将丢失并创建一个新的,从而丢失我之前设置的会话中的数据。

我试过玩 TDSSessionManager.SetThreadSession(sessionid) - 但我似乎无法让它工作。

我已经查看了广受好评的 Marco Cantu 白皮书,但是,它并没有为这个问题提供解决方案。

在这方面我能得到的任何帮助都会很棒——即使它只是“嘿,这个主题在第 X 本书中有所涉及”。

谢谢!

4

4 回答 4

1

TDSSessionManager.SetThreadSession(sessionid) 与 Session.sessionname 一起使用。

另外确保您的生命周期设置为会话(如 tondrej 所述)。

如果你重新连接你的客户端。一个新的会话开始。因此,您希望保持 Datasnap 连接处于打开状态。

或者您可以将生命周期设置为服务器并自己管理客户端会话。

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

于 2012-11-14T12:18:51.263 回答
1

您必须调整客户端 JavaScript 以使用 cookie 来存储会话信息。

请参阅JavaScript 客户端会话的最后一部分

如果要保持服务器端对象在会话中处于活动状态,请使用会话生命周期。

于 2015-07-26T03:30:28.090 回答
0

我相信您需要做的是将实例的LifeCycle属性设置为(有状态)。从您的问题看来,您目前正在使用(无状态)。TDSServerClassSessionInvocation

于 2012-07-09T13:16:11.210 回答
0

好吧,在 Datasnap REST(GET、POST、DELETE、PUT)中,如果您将 TDSServerClass 设置为会话,在这种情况下,REST 与调用相同,是无状态的(http://docwiki.embarcadero.com/RADStudio /Tokyo/en/Server_Class_LifeCycle#REST_Clients)。没错,你给了所有类型的客户机会来使用你的数据快照服务器,例如 JSON。

您需要创建您的所有者模型以对您的 REST 服务器进行会话控制,或者寻找一些框架来执行此操作。在我的情况下,我在 lifecicle 服务器上使用自定义对象(在某些情况下也使用数据库),并在请求标头和其他信息上使用令牌,我知道是否是同一个客户端,并且我也可以控制令牌何时过期并需要重新登录,例如,我也可以在 PUT resquests 上提供更多安全性,仅在提供给客户的记录上(这只是一种情况,但还有很多其他情况......)。您需要以其他方式解决,而不是使用 TDSSession 的经典方式。

于 2019-10-22T16:23:00.927 回答