TsgcWebSocketHTTPServer | Sessies

HTTP is een staatloos protocol (in ieder geval tot en met HTTP 1.1), dus de client vraagt een bestand op, de server stuurt een respons en de verbinding wordt gesloten (u kunt keep-alive inschakelen zodat de verbinding niet onmiddellijk wordt gesloten, maar dat valt buiten het bestek van dit artikel). Sessies stellen u in staat informatie over de client op te slaan, die bijvoorbeeld kan worden gebruikt bij het inloggen van een client. U kunt een willekeurige unieke sessie-ID gebruiken, de lijst met sessies doorzoeken om te zien of er al een bestaat, en zo niet een nieuwe sessie aanmaken. Een sessie kan worden vernietigd na een periode van inactiviteit of handmatig na het uitloggen van de client.

 

Configuratie

Er zijn enkele eigenschappen in TsgcWebSocketHTTPServer die sessies in het servercomponent in- of uitschakelen. De belangrijkste zijn:

 

Eigenschap Beschrijving
SessionState Dit is de eerste eigenschap die moet worden ingeschakeld om sessies te kunnen gebruiken. Zonder dat deze eigenschap is ingeschakeld, werken sessies niet

SessionTimeout

Hier moet u een waarde groter dan nul instellen (in milliseconden) voor de maximale tijd dat een sessie actief zal zijn.
AutoStartSession Sessies kunnen automatisch worden aangemaakt (AutoStartSession = true) of handmatig (AutoStartSession = false). Als sessies automatisch worden aangemaakt, gebruikt de server RemoteIP als unieke identificator om te controleren of er een actieve sessie is opgeslagen.

 

 


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

 

Sessie aanmaken

Om een nieuwe sessie te maken, moet u een nieuwe sessie-ID aanmaken die uniek is. U kunt elke gewenste waarde gebruiken. Voorbeeld: als de client zich authenticeert, kunt u gebruikersnaam + wachtwoord + extern IP-adres als sessie-ID gebruiken.

Zoek vervolgens in de sessielijst om te controleren of deze al bestaat. Als deze niet bestaat, maakt u een nieuwe aan.

 

Wanneer een nieuwe sessie wordt aangemaakt, wordt de gebeurtenis OnSessionStart aangeroepen en wanneer de sessie wordt gesloten, wordt de gebeurtenis OnSessionEnd geactiveerd.

 


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;