HTTP ist ein zustandsloses Protokoll (zumindest bis HTTP 1.1), daher fordert der Client eine Datei an, der Server sendet eine Antwort, und die Verbindung wird geschlossen (Sie können Keep-Alive aktivieren, sodass die Verbindung nicht sofort geschlossen wird, aber das geht über den Rahmen dieses Artikels hinaus). Sitzungen ermöglichen es Ihnen, Informationen über den Client zu speichern, die zum Beispiel während einer Client-Anmeldung verwendet werden können. Sie können eine beliebige eindeutige Sitzungs-ID verwenden, die Liste der Sitzungen durchsuchen, um zu sehen, ob bereits eine existiert, und falls nicht, eine neue Sitzung erstellen. Eine Sitzung kann nach einer Inaktivitätsperiode oder manuell nach der Client-Abmeldung zerstört werden.
Es gibt einige Eigenschaften in TsgcWebSocketHTTPServer, die Sitzungen in der Server-Komponente aktivieren/deaktivieren. Die wichtigsten sind:
| Eigenschaft | Beschreibung |
| SessionState | Dies ist die erste Eigenschaft, die aktiviert werden muss, um Sitzungen zu verwenden. Ohne aktivierte Eigenschaft funktionieren Sitzungen nicht |
|
SessionTimeout |
Hier müssen Sie einen Wert größer als null (in Millisekunden) für die maximale Zeit festlegen, die eine Sitzung aktiv sein wird. |
| AutoStartSession | Sitzungen können automatisch (AutoStartSession = true) oder manuell (AutoStartSession = false) erstellt werden. Wenn Sitzungen automatisch erstellt werden, verwendet der Server RemoteIP als eindeutigen Bezeichner, um zu prüfen, ob eine aktive Sitzung gespeichert ist. |
TsgcWebSocketHTTPServer1.SessionState := True;
TsgcWebSocketHTTPServer1.SessionTimeout := 600000;
AutoStartSession := False;
Um eine neue Sitzung zu erstellen, müssen Sie eine neue Session-ID erstellen, die eindeutig ist. Sie können jeden Wert verwenden. Beispiel: Wenn sich der Client authentifiziert, können Sie user + password + remoteip als Session-ID verwenden.
Durchsuchen Sie dann die Sitzungsliste, um zu prüfen, ob sie bereits existiert. Wenn sie nicht existiert, erstellen Sie eine neue.
Wenn eine neue Sitzung erstellt wird, wird das Ereignis OnSessionStart aufgerufen, und wenn die Sitzung geschlossen wird, wird das Ereignis OnSessionEnd ausgelöst.
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;