TsgcWebSocketHTTPServer | Sessions

HTTP est un protocole sans état (du moins jusqu'à HTTP 1.1), donc le client demande un fichier, le serveur envoie une réponse et la connexion est fermée (vous pouvez activer le keep-alive pour que la connexion ne soit pas fermée immédiatement, mais c'est hors du cadre de cet article). Les sessions vous permettent de stocker des informations sur le client, qui peuvent être utilisées lors d'une connexion client par exemple. Vous pouvez utiliser n'importe quel identifiant de session unique, rechercher dans la liste des sessions si l'une d'elles existe déjà, et sinon, créer une nouvelle session. Une session peut être détruite après une période d'inactivité ou manuellement après la déconnexion du client.

 

Configuration

Il existe certaines propriétés dans TsgcWebSocketHTTPServer qui activent/désactivent les sessions dans le composant serveur. Les plus importantes sont :

 

Propriété Description
SessionState Til s'agit de la première propriété qui doit être activée pour utiliser les Sessions. Sans cette propriété activée, les sessions ne fonctionneront pas

SessionTimeout

Vous devez ici définir une valeur supérieure à zéro (en millisecondes) pour la durée maximale pendant laquelle une session sera active.
AutoStartSession Les sessions peuvent être créées automatiquement (AutoStartSession = true) ou manuellement (AutoStartSession = false). Si les sessions sont créées automatiquement, le serveur utilisera RemoteIP comme identifiant unique pour vérifier s'il existe une session active stockée.

 

 


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

 

Créer une session

Pour créer une nouvelle session, vous devez créer un nouvel identifiant de session qui soit unique. Vous pouvez utiliser n'importe quelle valeur. Exemple : si le client s'authentifie, vous pouvez utiliser utilisateur + mot de passe + ip distante comme identifiant de session.

Ensuite, recherchez dans la liste des sessions si elle existe déjà. Si elle n'existe pas, créez-en une nouvelle.

 

Lorsqu'une nouvelle session est créée, l'événement OnSessionStart est appelé et lorsque la session est fermée, l'événement OnSessionEnd est déclenché.

 


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;