Cookies[RESOLVIDO]

6 respostas
leandronsp

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

gomesrod

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?

leandronsp

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.
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

leandronsp

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…

leandronsp

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…

leandronsp

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