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.
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;
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;