TsgcWebSocketHTTPServer | Sessions

O HTTP é um protocolo stateless (pelo menos até o HTTP 1.1), portanto o cliente solicita um arquivo, o servidor envia uma resposta, e a conexão é fechada (você pode habilitar keep-alive para que a conexão não seja fechada imediatamente, mas isso está além do escopo deste artigo). As sessões permitem que você armazene informações sobre o cliente, que podem ser utilizadas durante um login de cliente, por exemplo. Você pode utilizar qualquer session ID único, pesquisar a lista de sessões para ver se uma já existe e, caso não exista, criar uma nova sessão. Uma sessão pode ser destruída após um período de inatividade ou manualmente após o logout do cliente.

 

Configuração

Existem algumas propriedades no TsgcWebSocketHTTPServer que habilitam/desabilitam sessões no componente servidor. As mais importantes são:

 

Propriedade Descrição
SessionState Testa é a primeira propriedade que deve ser habilitada para usar Sessions. Sem esta propriedade habilitada, as sessions não funcionarão

SessionTimeout

Aqui você deve definir um valor maior que zero (em milissegundos) para o tempo máximo em que uma sessão estará ativa.
AutoStartSession As sessões podem ser criadas automaticamente (AutoStartSession = true) ou manualmente (AutoStartSession = false). Se as sessões forem criadas automaticamente, o servidor utilizará RemoteIP como identificador único para verificar se há uma sessão ativa armazenada.

 

 


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

 

Criar Sessão

Para criar uma nova sessão, você deve criar um novo session ID que seja único. Você pode usar qualquer valor. Exemplo: se o cliente está se autenticando, você pode usar usuário + senha + remoteip como o session ID.

Em seguida, pesquise a lista de sessões para verificar se ela já existe. Se não existir, crie uma nova.

 

Quando uma nova sessão é criada, o evento OnSessionStart é chamado e, quando a sessão é fechada, o evento OnSessionEnd é gerado.

 


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;