TsgcWebSocketHTTPServer | Sessioni

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.

 

Configurazione

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;

 

Crea sessione

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;