Trabalhando com biscoitos em cabeçalhos (cookies HTTP)

Iniciado por rafael, Junho 27, 2017, 08:23:03 PM

tópico anterior - próximo tópico

rafael

Venho compartilhar uma experiência com cookies em http para sessões de usuários.

Primeiramente sabemos que o protocolo HTTP não trabalha com sessões diretamente.
Cada conexão estabelecida serve para troca de informações naquele momento e não fica aberta para dizer que o usuário está conectado.
Para isso são usados os biscoitos na cabeça do documento ou " cookies in  header", que nada mais são que um conjunto de definições de cadeia e seu tempo de vida e algumas outras coisas. Essas informações são trocadas entre o servidor e o navegador.

Supondo que quero definir uma sessão para o usuário=Rafael:

Deixe o navegador ganhar um biscoito :


imprima([[ Set-Cookie: usuario=rafael; ]])

O código acima tem que ficar antes de qualquer coisa, porque o que o navegador interpreta quando faz uma requisição primeiro são os cabeçalhos depois vem o código html.
Este biscoito agora ficou no pote do navegador, está guardado.
Quando o navegador fizer uma nova requisição ao servidor ele enviará este biscoito na cabeça também, veja:

imprima(cgi.va.http_cookie()) //--> resultado :   usuario=rafael;

no exemplo acima usei as funções do pcgi

Meu objetivo é dar 1 minuto a sessão do usuário rafael, depois disso a raposa come o biscoito.
Neste caso é preciso trabalhar com as funções de tempo e data:

agora=sis.tempo()
daqui1minuto=sis.data("%a, %d %b %Y %H:%M:%S GMT",agora+10860)
// --> o navegador só entende assim: Tue, 27 Jun 2017 16:08:17 GMT --> nós estamos atrasados 3 horas em relação ao tempo médio de Greenwich
// neste exemplo agora+10860 estou somando 3 horas e um minuto, cada hora são 3600 segundos

ID = string.formate("%X", agora )  //converte numero em hexadecimal
imprima("Set-Cookie: usuario=rafael; Expires="..daqui1minuto)
imprima("Set-Cookie: IDdaSessao="..ID.."; Expires="..daqui1minuto)

No exemplo acima mandei dois biscoitos pra raposa (firefox)
que são: usuario=rafael; e IDdaSessao=1DB7DF74;
mandei também o tempo que o biscoito leva pra assar: 60 segundos

Então no próximo pedido que a raposa fizer se o biscoito já tiver assado ela já devorou e não vai devolver na requisição.
Cabe ao servidor fazer essa verificação:


biscoito = cgi.va.http_cookie();

se não biscoito ou biscoito == nulo ou biscoito =='' então
imprima'Não tem biscoito'
senão
imprima(biscoito)
fim


No código acima se faz um teste pra saber se existe ou não o biscoito enviado pelo navegador,
A partir daqui podemos armazenar o que o navegador passar pra saber se a sessão está ativa ou não.

OBSERVAÇÃO: caso não defina o tempo que leva pra assar, a raposa vai comer o biscoito quando for dormir. Isto é, expira automaticamente quando fechar o navegador, mas isso não funciona em todos os navegadores.

Dúvidas ou sugestões estou aí.

adalberto

Ótimo, muito útil para alguns projetos que quero desenvolver no futuro.