HTTP es un protocolo sin estado (al menos hasta HTTP 1.1), de modo que el cliente solicita un archivo, el servidor envía una respuesta y la conexión se cierra (puede habilitar keep-alive para que la conexión no se cierre inmediatamente, pero eso está fuera del ámbito de este artículo). Las sesiones permiten almacenar información sobre el cliente, que puede usarse durante el inicio de sesión de un cliente, por ejemplo. Puede usar cualquier id de sesión único, buscar en la lista de sesiones si ya existe una y, si no, crear una nueva sesión. Una sesión puede destruirse tras un período de inactividad o manualmente tras el cierre de sesión del cliente.
Hay algunas propiedades en TsgcWebSocketHTTPServer que habilitan/deshabilitan las sesiones en el componente servidor. Las más importantes son:
| Propiedad | Descripción |
| SessionState | Esta es la primera propiedad que debe habilitarse para usar las sesiones. Sin esta propiedad habilitada, las sesiones no funcionarán |
|
SessionTimeout |
Aquí debe establecer un valor mayor que cero (en milisegundos) para el tiempo máximo que una sesión estará activa. |
| AutoStartSession | Las sesiones pueden crearse automáticamente (AutoStartSession = true) o manualmente (AutoStartSession = false). Si las sesiones se crean automáticamente, el servidor utilizará RemoteIP como identificador único para comprobar si existe una sesión activa almacenada. |
TsgcWebSocketHTTPServer1.SessionState := True;
TsgcWebSocketHTTPServer1.SessionTimeout := 600000;
AutoStartSession := False;
Para crear una nueva sesión, debe crear un nuevo ID de sesión que sea único. Puede utilizar cualquier valor. Ejemplo: si el cliente se está autenticando, puede usar usuario + contraseña + IP remota como ID de sesión.
A continuación, busque en la lista de sesiones para comprobar si ya existe. Si no existe, cree una nueva.
Cuando se crea una nueva sesión, se llama al evento OnSessionStart y, cuando la sesión se cierra, se lanza el 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;