Skip to content
mobius1qwe edited this page Nov 12, 2026 · 1 revision

Home > Servir site e arquivos > Sessões 🚧

Sessões do navegador (TRALWebModule)

Important

Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.

Vale para a 2.0 · Nível: intermediário

Em uma frase: o TRALWebModule guarda dados por visitante; na 2.0 a sessão pode ficar na memória, num armazém compartilhado entre servidores ou no próprio cookie.

Você vai precisar: RALModuleWebPackage; para wssStore, um TRALKeyValueStore (como o TRALFileStore).

Onde a sessão fica

SessionStorage onde quando usar
wssMemory (padrão) no módulo; perdida ao reiniciar, um processo só um servidor, precisa de objetos vivos
wssStore em SessionStore vários servidores/processos compartilhando
wssCookie no navegador, assinada e cifrada com SessionSecret (AES-256 + HMAC) sem estado no servidor
Web.SessionStorage := wssStore;
Web.SessionStore := TRALFileStore.Create(Self);   // pasta comum aos servidores

// ou, sem estado:
Web.SessionStorage := wssCookie;
Web.SessionSecret := 'segredo-longo-igual-em-todos-os-servidores';

Usando

procedure TForm1.Entrar(ARequest: TRALRequest; AResponse: TRALResponse);
var
  vSessao: TRALWebSession;
begin
  // ... confere a senha ...
  vSessao := Web.RegenerateSession(ARequest, AResponse);  // id novo no login
  vSessao.Values['usuario'] := 'ana';
  AResponse.Answer(HTTP_OK, '{"ok":true}');
end;

procedure TForm1.Sair(ARequest: TRALRequest; AResponse: TRALResponse);
begin
  Web.EndSession(ARequest, AResponse);
end;
propriedade / método
SessionTimeout ms parada antes de cair (30 min); 0 = nunca
SessionStore, SessionSecret exigidos por wssStore e wssCookie
SessionCookieMaxSize maior cookie de sessão em bytes (4000); um valor que passe disso levanta exceção
OpenSession acha ou cria a sessão e envia o cookie
Session[ARequest] só procura; nil se não houver
RegenerateSession novo id mantendo o conteúdo: chame no login, contra fixação de sessão
EndSession apaga a sessão e manda o navegador largar o cookie (logout)
TRALWebSession.Name o id
Values[nome] texto, em qualquer armazenamento
Objects[nome] objeto vivo, só em wssMemory
HasValue, DeleteValue, ValueNames, Clear o resto da lista

Por que objetos vivos só na memória

Em wssStore e wssCookie a sessão existe só durante um pedido: é lida do armazém ou do cookie e liberada no fim. Um objeto não sobreviveria a isso (nem poderia ser gravado), então Objects levanta exceção fora de wssMemory. Guarde texto em Values (um id, um JSON) e recrie o objeto quando precisar.

Armadilhas

o que acontece causa o que fazer
sessão por cookie não some no logout em outro aparelho o servidor não guarda nada: uma cópia do cookie vale até SessionTimeout use wssStore se precisa revogar
exceção ao gravar em Session[ARequest] no modo cookie ela é só leitura use OpenSession para alterar
valor não chega ao navegador gravado depois do primeiro Send de uma resposta em fluxo grave antes do primeiro Send
todos deslogados ao trocar de servidor SessionSecret diferente ou vazio mesmo segredo em todos; trocar encerra todas as sessões
exceção ao iniciar wssStore sem SessionStore, wssCookie sem SessionSecret preencha
cookie estoura 4 KB muito dado em Values guarde só ids; ou use wssStore

O cookie vai HttpOnly, SameSite=Lax e Secure sob HTTPS.

Veja também

Começar

Servidor

MQTT 🚧

E-mail 🚧

Cliente

Motores

Avançado

Ajuda

🚧 = em desenvolvimento, pode mudar

Clone this wiki locally