TsgcWebSocketHTTPServer | Sessions

HTTP ist ein zustandsloses Protokoll (zumindest bis HTTP 1.1), daher fordert der Client eine Datei an, der Server sendet eine Antwort, und die Verbindung wird geschlossen (Sie können Keep-Alive aktivieren, sodass die Verbindung nicht sofort geschlossen wird, aber das geht über den Rahmen dieses Artikels hinaus). Sitzungen ermöglichen es Ihnen, Informationen über den Client zu speichern, die zum Beispiel während einer Client-Anmeldung verwendet werden können. Sie können eine beliebige eindeutige Sitzungs-ID verwenden, die Liste der Sitzungen durchsuchen, um zu sehen, ob bereits eine existiert, und falls nicht, eine neue Sitzung erstellen. Eine Sitzung kann nach einer Inaktivitätsperiode oder manuell nach der Client-Abmeldung zerstört werden.

 

Konfiguration

Es gibt einige Eigenschaften in TsgcWebSocketHTTPServer, die Sitzungen in der Server-Komponente aktivieren/deaktivieren. Die wichtigsten sind:

 

Eigenschaft Beschreibung
SessionState Dies ist die erste Eigenschaft, die aktiviert werden muss, um Sitzungen zu verwenden. Ohne aktivierte Eigenschaft funktionieren Sitzungen nicht

SessionTimeout

Hier müssen Sie einen Wert größer als null (in Millisekunden) für die maximale Zeit festlegen, die eine Sitzung aktiv sein wird.
AutoStartSession Sitzungen können automatisch (AutoStartSession = true) oder manuell (AutoStartSession = false) erstellt werden. Wenn Sitzungen automatisch erstellt werden, verwendet der Server RemoteIP als eindeutigen Bezeichner, um zu prüfen, ob eine aktive Sitzung gespeichert ist.

 

 


TsgcWebSocketHTTPServer1.SessionState := True;
TsgcWebSocketHTTPServer1.SessionTimeout := 600000;
AutoStartSession := False;

 

Sitzung erstellen

Um eine neue Sitzung zu erstellen, müssen Sie eine neue Session-ID erstellen, die eindeutig ist. Sie können jeden Wert verwenden. Beispiel: Wenn sich der Client authentifiziert, können Sie user + password + remoteip als Session-ID verwenden.

Durchsuchen Sie dann die Sitzungsliste, um zu prüfen, ob sie bereits existiert. Wenn sie nicht existiert, erstellen Sie eine neue.

 

Wenn eine neue Sitzung erstellt wird, wird das Ereignis OnSessionStart aufgerufen, und wenn die Sitzung geschlossen wird, wird das Ereignis OnSessionEnd ausgelöst.

 


procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; 
  AResponseInfo: TIdHTTPResponseInfo);
var
  vID: String;
  oSession: TIdHTTPSession;
begin
  if ARequestInfo.Document = '/' then
    AResponseInfo.ServeFile(AContext, 'yourpathhere\index.html')
  else
  begin
    // check if user is valid
    if not ((ARequestInfo.AuthUsername = 'user') and (ARequestInfo.AuthPassword = 'pass')) then
      AResponseInfo.AuthRealm := 'Authenticate'
    else
    begin
      // create a new session id with authentication data
      vID := ARequestInfo.AuthUsername + '_' + ARequestInfo.AuthPassword + '_' + ARequestInfo.RemoteIP;
 
      // search session
      oSession := TsgcWebSocketHTTPServer1.SessionList.GetSession(vID, ARequestInfo.RemoteIP);
 
      // create new session if not exists
      if not Assigned(oSession) then
        oSession := TsgcWebSocketHTTPServer1.SessionList.CreateSession(ARequestInfo.RemoteIP, vID);
 
      AResponseInfo.ContentText := '<html><head></head><body>Authenticated</body></html>';
      AResponseInfo.ResponseNo := 200;
    end;
  end;
end;