Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Manipulação de cookies: Servlet Logout

Olá, não estou conseguindo criar um servlet para logout de uma página (neste caso zerando o tempo do cookie). Ele chega a retornar a mensagem de usuário deslogado, mas consultando o console ainda aparece usuario.logado (nome do meu cookie):

Logout:

package br.com.alura.gerenciador;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/logout")
public class Logout extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        PrintWriter write = resp.getWriter();
        if (cookies != null){
           for (Cookie cookie : cookies) {
               if (cookie.getName().equals("usuario.logado")){
                   cookie.setMaxAge(0);
               }
           }
           write.println("<html><body>usuario deslogado</body></html>");
        }else{
            write.println("<html><body>nenhum usuario logado</body></html>");
        }
    }
}

HTML


<html>
    <body>
        Bem vindo ao nosso gerenciador de empresas!<br/>
        <form action = "busca">
            Nome:<br/>
            <input type="text" name="nome"><br/>
            <input type="submit" value="enviar">
        </form>
        Cadastra empresa:<br/>
         <form action = "cadastra" method = "post">
            Nome:<br/>
            <input type="text" name="nome"><br/>
            <input type="submit" value="enviar">
        </form>
        <form action="login" method="post">
            Email: <input type="text" name="email" /><br />
            Senha: <input type="password" name="senha" /><br />
        <input type="submit" value="Login" />
        </form>

        <form action="logout" method="post">
            <input type="submit" value="Logout" />
        </form>
</form>
    </body>
</html>
3 respostas

A sua lógica está correta, Gustavo, deve ter alguma coisa errada na leitura dos cookies. Tente imprimir o nome de todos os cookies! Outra coisa boa de se fazer é colocar a mensagem somente se você encontrar o cookie!

if (cookies != null){
  for (Cookie cookie : cookies) {
    System.out.println("cookie: ["+cookie.getName()+"]");
    if (cookie.getName().equals("usuario.logado")){
      cookie.setMaxAge(0);
      write.println("<html><body>usuario deslogado</body></html>");
    }
  }
}

Isso vai te ajudar a descobrir se tem algo errado com o cookie e também com o seu fluxo.

Os colchetes servem pra você conseguir visualizar se não existe nenhum espaço em branco que pode ter sido utilizado sem querer.

solução!

Descobri!

Depois de alterar um Cookie temos que mandá-lo de volta no nosso http response:


@WebServlet(urlPatterns = "/logout")
public class Logout extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter write = resp.getWriter();

        Cookie[] cookies_teste = req.getCookies();//peguei todos os cookies

        for (Cookie cookie1 : cookies_teste) {
            if (cookie1.getName().equals("usuario.logado")) {
                System.out.println("Te achei Cookie do inferno");
                cookie1.setMaxAge(0);
                resp.addCookie(cookie1); //AQUI!
                write.println("<html><body>usuario deslogado</body></html>");
            }
        }

    }
}

Boa! Vi que você também aceitou minha sugestão de escrever na página somente quando o cookies for invalidado.

Isso é mais boa prática mesmo, pra garantir que a mensagem pro usuário seja enviada somente se realmente ocorreu a ação!

Bons estudos e não hesite em criar novas dúvidas!