如何在TIdHTTPServer中使用TIdHTTPSession?

时间:2019-01-13 10:46:55

标签: delphi

我不了解TIdHTTPServer中TIdHTTPSession的概念。这是为了什么它是一种用于请求的容器,还是什么?启用AutoSessionStart后如何正确使用它?如果我不启用AutoSessions,会发生什么?

例如,假设我们有一些共享资源FMyMessages: TStringList;,那么我应该如何在有/没有会话的情况下请求此共享资源?

TIdHTTPSession有一个FLock: TIdCriticalSection;成员-因此,如果我有FMyMessages,也许我应该使用它来将共享资源AutoSessions与其他线程锁定,否则应该使用自己的关键部分?

此外,我现在该如何计算会话数?我这样尝试过,但是不起作用:

Server.Contexts.Count.ToString;

1 个答案:

答案 0 :(得分:1)

  

我不了解TIdHTTPServer中TIdHTTPSession的概念吗?这是为了什么它是一种用于请求的容器,还是什么?启用AutoSessionStart后如何正确使用它?

HTTP是无状态协议。它不会记住从一个请求到下一个请求的信息。而且它甚至不能保证或要求TCP连接本身在请求之间保持打开状态。

这是会话起作用的地方。服务器可以创建一个会话对象来存储信息,例如在客户端登录期间,并且该会话的唯一ID通过HTTP cookie发送给客户端,客户端可以在后续请求中将其发送回服务器以重用同一会话。宾语。最终,如果您未明确结束会话(例如在客户端注销期间),会话将超时并被破坏。

  

如果我不启用AutoSessions,会发生什么?

如果每个请求都不存在,服务器将不会自动自动创建一个新的会话对象。您将不得不根据需要手动创建一个新会话。

  

例如,假设我们有一些共享资源FMyMessages: TStringList;,那么我应该如何在有/没有会话的情况下请求此共享资源?

会话与访问共享资源无关,而与持久保存每个客户端状态数据无关。例如用户登录名,数据库连接等。

  

TIdHTTPSession有一个FLock: TIdCriticalSection;成员-因此,如果我有FMyMessages,也许我应该使用它来将共享资源AutoSessions与其他线程锁定,否则应该使用自己的关键部分?

不。您可以改用Indy的TIdThreadSafeStringList

  

此外,我现在该如何计算会话数?我这样尝试过,但是不起作用:

Server.Contexts.Count.ToString;

Contexts属性存储活动的客户端TCP连接。这与HTTP会话无关。那些存储在服务器的SessionList属性中。