TsgcWebSocketHTTPServer | Sesiones

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.

 

Configuración

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;

 

Crear Sesión

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;