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