HTTP è un protocollo senza stato (almeno fino a HTTP 1.1), quindi il client richiede un file, il server invia una risposta e la connessione viene chiusa (è possibile abilitare il keep-alive in modo che la connessione non venga chiusa immediatamente, ma ciò va oltre lo scopo di questo articolo). Le sessioni consentono di memorizzare informazioni sul client, che possono essere utilizzate durante un login del client, ad esempio. È possibile utilizzare qualsiasi ID sessione univoco, cercare nell'elenco delle sessioni se ne esiste già una e, in caso contrario, crearne una nuova. Una sessione può essere distrutta dopo un periodo di inattività o manualmente dopo il logout del client.
Esistono alcune proprietà in TsgcWebSocketHTTPServer che abilitano/disabilitano le sessioni nel componente server. Le più importanti sono:
| Property | Descrizione |
| SessionState | Questa è la prima proprietà che deve essere abilitata per poter utilizzare le Sessioni. Senza questa proprietà abilitata, le sessioni non funzioneranno |
|
SessionTimeout |
Qui è necessario impostare un valore maggiore di zero (in millisecondi) per il tempo massimo di attività di una sessione. |
| AutoStartSession | Le sessioni possono essere create automaticamente (AutoStartSession = true) o manualmente (AutoStartSession = false). Se le sessioni vengono create automaticamente, il server utilizzerà RemoteIP come identificatore univoco per verificare se è presente una sessione attiva memorizzata. |
TsgcWebSocketHTTPServer1.SessionState := True;
TsgcWebSocketHTTPServer1.SessionTimeout := 600000;
AutoStartSession := False;
Per creare una nuova sessione, è necessario creare un nuovo ID sessione che sia univoco. È possibile utilizzare qualsiasi valore. Esempio: se il client si sta autenticando, è possibile utilizzare utente + password + IP remoto come ID sessione.
Quindi, cercare nell'elenco delle sessioni se esiste già. Se non esiste, crearne una nuova.
Quando viene creata una nuova sessione viene chiamato l'evento OnSessionStart e quando la sessione viene chiusa viene generato l'evento OnSessionEnd.
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;