Cookies[RESOLVIDO]

6 respostas
L

Olá pessoal,

Estou querendo colocar um cookie para login de usuários, e já estou há algum tempo com dificuldades para fazer funcionar.
Quando o usuário marca a opção “lembrar de mim”, o sistema cria o cookie e coloca no browser numa boa, com o prazo determinado de 1 semana.

Um CookieFilter filtra as requisições para a pagina inicial e verifica o cookie do request, colocando o usuário na sessão.

Até aí tudo bem. O problema está sendo com os navegadores. Tanto no FF quanto no Chrome, qdo o usuário acessa o site na primeira requisição, ele não é jogado na sessão. Só após o refresh da pagina é que o sistema coloca o usuário na sessão. Ou seja, na primeira requisição, a resposta é a página “deslogada”. E na segunda, a página “logada”.

No IE, qdo faço o login e peço pra lembrar de mim, eu verifico se ele está com o cookie. E está. Porém se fecho o IE e abro de novo, o cookie não está mais lá.

Resumindo: no IE, ele perde o cookie assim que fecho o browser. No FF e Chrome, ele não perde, porém tenho que fazer duas requisições para estabelecer a sessão. Fui claro?

Pesquisei internet afora e ainda não encontrei nehuma solução para este problema. Já coloquei o Header “Cache-Control: no-cache” e o “Expires” mas ainda não adiantou.
Alguém pode me ajudar?

Desde já sou grato. []´s

6 Respostas

G

Essa situação parece esquisita mesmo…
Algumas pistas que eu acho que podem dar mais informações:

  • Você está setando manualmente o tempo de vida do cookie, através do método cookie.setMaxAge() ? Se não estiver, pode ser que o IE esteja tratando por default como não-persistente e por isso apaga quando é fechado.

  • Tente utilizar um “sniffer” HTTP - ferramenta que monitora as requisições e mostra todos os headers enviados e recebidos. Com isso você pode confirmar com certeza quais cookies são enviados ou não pelo browser, e em que momento. Você já utiliza essas ferramentas?

L

gomesrod:

  • Você está setando manualmente o tempo de vida do cookie, através do método cookie.setMaxAge() ? Se não estiver, pode ser que o IE esteja tratando por default como não-persistente e por isso apaga quando é fechado.

Sim, estou setando na mão ( o calculo dá 1 semana). E habilitei no IE tbm para aceitar cookies geral.

gomesrod:

  • Tente utilizar um “sniffer” HTTP - ferramenta que monitora as requisições e mostra todos os headers enviados e recebidos. Com isso você pode confirmar com certeza quais cookies são enviados ou não pelo browser, e em que momento. Você já utiliza essas ferramentas?

uso o Live HTTP Headers para o FF.
G

Nesse caso o único conselho que posso dar é: leva sua aplicação pra benzê :smiley:

Agora falando sério: eu queria criar um aplicativozinho de teste para ver se a situação acontece e tentar ter alguma idéia, mas estou em uma máquina que não tem o ambiente… por enquanto não consigo pensar em mais nada

L

gomesrod:
Nesse caso o único conselho que posso dar é: leva sua aplicação pra benzê :smiley:

Agora falando sério: eu queria criar um aplicativozinho de teste para ver se a situação acontece e tentar ter alguma idéia, mas estou em uma máquina que não tem o ambiente… por enquanto não consigo pensar em mais nada

kkkk…valeu, obrigado pela atenção. Vou tentando alguma coisa por aqui…

L

Consegui fazer funcionar no IE. Por incrível que pareça, tive que “setar” na mão o header Set-Cookie do response, com o valor sendo os dados do cookie. Antes eu apenas instanciava o cookie e adicionava ao response. Ficou meio POG né, mas não encontrei outra solução…rss

Só não consegui resolver ainda o problema de cache nos browsers. Tanto no IE, FF e Chrome, tenho que fazer duas requisições para estabalecer a sessão.
Eu estou usando da seguinte forma:

httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpResponse.setHeader("Expires", "Tue, 27 Apr 1971 19:44:06 EST");
httpResponse.setHeader("Pragma", "no-cache");

e mesmo assim nada…

L

Conseguimos resolver o problema da “cache” nos browsers.
Fizemos um javascript no cabeçalho do sistema (head.jsp), que verifica os cookies do request e faz o reload da página:

<c:if test="${empty sessionScope.usuario.id}">
		<script>
			var a_all_cookies = document.cookie.split( ';' );
			for ( i = 0; i < a_all_cookies.length; i++ ) {
			   a_temp_cookie = a_all_cookies[i].split( '=' );
			   cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
			   if (cookie_name == 'nomeDoCookie') {
			       window.location.reload()
			   }
			}
		</script>
</c:if>

Agora está tudo ok, funcionando nos 3 browsers citados e carregando a página corretamente.
Obrigado pela atenção gomesrod!

Criado 9 de dezembro de 2009
Ultima resposta 10 de dez. de 2009
Respostas 6
Participantes 2