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

Dúvida no Ex. 3 da Aula 9 - Redirecionamento no client e server side

Quando clico o botao de logout/deslogar no navegador, seja ele chrome, firefox, opera, edge, etc, acontece o seguinte erro:

type Status report
message /logout
description The requested resource is not available.
Apache Tomcat/8.0.29

Mas no navegador do proprio eclipse executa sem problemas, nao entendo porquê?

4 respostas

Oi Cremildo,

Me envia o código de logout por favor, assim posso analisar se temos algum problema.

Abraço

Oi Paulo!

Aqui está o código:

package br.com.alura.gerenciador.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Logout implements Tarefa {

    @Override
    public String executa(HttpServletRequest req, HttpServletResponse resp) {
        req.getSession().removeAttribute("usuarioLogado");
        return "/WEB-INF/paginas/logout.html";
    }

}

A classe Controller:

package br.com.alura.gerenciador.web;

import java.io.IOException;

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

@WebServlet(urlPatterns = "/executa")
public class Controller extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String tarefa = req.getParameter("tarefa");
        if (tarefa == null) {
            throw new IllegalArgumentException("Voce nao passou a tarefa!");
        }
        tarefa = "br.com.alura.gerenciador.web." + tarefa;
        try {
            Class<?> nomeDaClasse = Class.forName(tarefa);
            Tarefa instancia = (Tarefa) nomeDaClasse.newInstance();
            String pagina = instancia.executa(req, resp);
            RequestDispatcher dispatcher = req.getRequestDispatcher(pagina);
            dispatcher.forward(req, resp);

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            throw new ServletException(e);
        }

    }

}

E a view index.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<h1>Bem vindo ao nosso gerenciador de empresas</h1><br/>

    <c:if test="${not empty usuarioLogado }">
        Logado como ${usuarioLogado.email}<br/>
    </c:if>

    <form action="executa?tarefa=NovaEmpresa" method="post">
        Nome: <input type="text" name="nome"/><br/>
              <input type="submit" value="Enviar"/>
    </form>

    <form action="login" method="POST">
        Email:<input type="email" name="email"/>
        Senha:<input type="password" name="senha"/> 
        <input type="submit" name="Login"/>
    </form>

    <form action="executa" method="POST">
    <input type="hidden" name="tarefa" value="Logout" />
    <input type="submit" value="Logout"/>
    </form>

</body>
</html>

Acontece que o logout funciona antes de exexutar qualquer tarefa, isto é, que seja a primeira tarefa antes de qualquer outra logo após acessar a uri: http://localhost:8082/gerenciador. Basta executar, antes ou depois , qualquer outra tarefa, seja ela buscaEmpresa, novaEpresa ou login, o logout já não executa mais, aliás, não só o logout não executa, mas qualquer outra tafefa anteriormente mencionada não executa, mostrando o mesmo erro mencionado anteriormente.

Cremildo, já tentou usar o recurso do desenvolvedor para ver se existe algum problema na requisição?

No chrome, pressione, F12 e olhe na aba Network para ver o request que é feito (POST) e veja se ele retorna diferente de 200.

Se não conseguir ver nada diferente, me envia o projeto que dou uma olhada na minha máquina, mais fácil. Envia para (paulo.alves@caelum.com.br)

Abraço

solução!

Oi Paulo, já roda e executa normalmente, não sei exactamente qual era o problema.