Cookies e sessions são maneiras de guardar algumas informações do usuário que visita determinada página, ou aplicação Web em arquivos, de maneira a tornar essas informações disponíveis entre várias páginas e, às vezes, entre visitas do usuário ao site (desde que o navegador não seja fechado e os dados de navegação não sejam apagados).
O cookie normalmente é gravado na máquina do cliente, em diretório diferente de acordo com o navegador utilizado e o sistema operacional. As informações salvas em cookies podem ser acessadas pelo usuário na máquina local e até alteradas - o que torna o cookie pouco seguro, se comparado às
sessions.
As sessions (ou sessões) possuem funcionamento similar ao dos cookies, porém, o arquivo que guarda as informações é mantido no servidor do site visitado e identificado por uma cadeia alfanumérica única para cada visitante.
O usuário não pode alterar informações de sua sessão, a menos que o site permita. Por ser mais seguro que o cookie, as informações de login e senha, por exemplo, são comumente guardadas em sessões.
Para este exemplo, vamos criar uma nova action em nosso Webmodule com o nome "info". Para que o controle por sessions seja possível em nossa aplicação, marque a propriedade "CreateSession" como "True", através do "Object Inspector".
No evento "OnRequest" da "action info", adicione o seguinte código:
procedure TFPWebModule1.infoRequest(Sender: TObject; ARequest: TRequest;
AResponse: TResponse; var Handled: Boolean);
var
cv : string;
cookie: TCookie;
begin
//pega o valor de uma chave de Cookie para testar se ele existe
cv := ARequest.CookieFields.Values['meucookie'];
//Se o valor da chave 'meucookie' existir...
if cv <> '' then
begin
//mostra o valor da chave
AResponse.Content := 'Cookie tem valor: ' + cv + '<br /><br />';
end
else begin
//se não, retorna não configurado e prepara para a próxima execução
AResponse.Contents.Add( 'Cookie não configurado!<br /><br />' );
//cria o Cookie que será lido na próxima execução
cookie := AResponse.Cookies.Add;
cookie.Name := 'meucookie';
cookie.Value := 'valor_do_cookie';
end;
//Se a aplicação puder criar a Session...
if CreateSession and Assigned(Session) then
begin
//verifica se há uma variável de sessão com algum valor
if Session.Variables['minhasession'] <> '' then
begin
AResponse.Contents.Add( 'Session ID: ' + Session.SessionID + '<br />' );
AResponse.Contents.Add( 'Session minhasession tem valor: ' + Session.Variables['minhasession'] );
end
//se não houver valor, informa e atribui para a próxima execução
else begin
AResponse.Contents.Add( 'Session sem valor!' );
//O ID da Session é atribuído automaticamente
//só precisamos adicionar valores às variáveis que utilizaremos
Session.Variables['minhasession'] := 'valor_da_minha_session';
end;
end
else begin
AResponse.Contents.Add( 'Erro criando sessão!' );
end;
//informa que a ação foi completada
Handled := true;
end;
Os comentários no código explicam o que cada linha faz. Você vai notar que usei a tag <br /> no final de algumas linhas; é o correspondente em HTML para o \n, já que a saída da nossa aplicação será interpretada pelo navegador.
Agora, podemos compilar nosso projeto e colocá-lo na pasta "cgi-bin" do servidor. Para testá-lo, acessamos a seguinte URL no navegador:
- http://127.0.0.1/cgi-bin/projeto.cgi/info
A priori, não haverão informações a serem apresentadas, já que esta é a primeira vez que o programa é executado, e tanto o cookie quanto a session, acabaram de ser criados.
Recarregue a página e as informações serão apresentadas. O que ocorre nesta segunda execução é nada mais que a verificação de existências de cookies e sessions (se eles já foram criados para este usuário) e, em caso positivo, apresenta as informações geradas na primeira vez (na criação).
Lembre-se que essas informações poderão persistir até que o navegador seja fechado, assim, se quiser fazer um novo teste, limpe o cache do navegador e atualize a página.