Oie José, tudo bem contigo?
Perdão pela demora!
Essa solução que vou mostrar abaixo deve ser feita com o projeto desse curso finalizado.
Para isso ser implementado algumas mudanças teriam que ser feitas, principalmente nos "redirects" de cada classe do pacote "acao" e das jsps.
Inicialmente devemos alterar o "web.xml":
<filter-mapping>
<filter-name>MF</filter-name>
<url-pattern>/*</url-pattern> // de /entrada para /*
</filter-mapping>
<filter>
<filter-name>AF</filter-name>
<filter-class>br.com.alura.gerenciador.servlet.AutorizacaoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AF</filter-name>
<url-pattern>/*</url-pattern> // de /entrada para /*
</filter-mapping>
<filter>
<filter-name>CF</filter-name>
<filter-class>br.com.alura.gerenciador.servlet.ControladorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CF</filter-name>
<url-pattern>/*</url-pattern> // de /entrada para /*
</filter-mapping>
Agora devemos fazer mudanças nos "filters":
AutorizacaoFilter:
//@WebFilter("/entrada")
public class AutorizacaoFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
System.out.println("AutorizacaoFilter");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String url = request.getRequestURI(); // essa linha devolve por exemplo: "gerenciador/ListaEmpresas"
String [] array = url.split("/"); // devemos pegar somente o que vem como "parametro" , ou seja, "ListaEmpresas" e para isso fazemos o split, que vai fragmentar essa string em uma array
String paramAcao = array [2]; // aqui iremos pegar a posição 2 da array, ou seja, "ListaEmpresas" e iremos salver dentro de paramAcao
System.out.println(paramAcao);
//alterações sendo feitas
HttpSession sessao = request.getSession();
boolean usuarioNaoEstaLogado = (sessao.getAttribute("usuarioLogado") == null);
boolean ehUmaAcaoProtegida = !(paramAcao.equals("Login") || paramAcao.equals("LoginForm"));
if(ehUmaAcaoProtegida && usuarioNaoEstaLogado) {
// response.sendRedirect("entrada?acao=LoginForm");
response.sendRedirect("LoginForm"); // aqui deve ser alterado para apenas "LoginForm"
return;
}
chain.doFilter(request, response);
}
}
ControladorFilter:
public class ControladorFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
System.out.println("ControladorFilter");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// aqui fazemos igual ao "AutorizacaoFilter":
String url = request.getRequestURI();
String [] array = url.split("/");
String paramAcao = array [2];
System.out.println(paramAcao);
String nomeDaClasse = "br.com.alura.gerenciador.acao." + paramAcao;
String nome;
try {
Class classe = Class.forName(nomeDaClasse);
Acao acao = (Acao) classe.newInstance();
nome = acao.executa(request,response);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ServletException | IOException e) {
throw new ServletException(e);
}
String[] tipoEEndereco = nome.split(":");
if(tipoEEndereco[0].equals("forward")) {
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/" + tipoEEndereco[1]);
rd.forward(request, response);
} else {
response.sendRedirect(tipoEEndereco[1]); // aqui tiramos a parte "entrada?acao=" e deixams apenas "tipoEEndereco[1]"
}
}
}
Fazendo essas mudanças acima apartir da url "http://localhost:8080/gerenciadorr/LoginForm" você já conseguirá chegar na página de login da aplicação. Entretanto, agora você terá que atualizar cada umas das JSPs e classes do pacote "acao" para fazer o redirecionamento correto.
Por exemplo na JSP "formLogin":
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:url value="/Login" var="linkServletNovaEmpresa" /> // o value deve ser "Login"
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="${linkServletNovaEmpresa}" method="post">
Login: <input type="text" name="login" /> Senha: <input
type="password" name="senha"> <input type="submit" />
// tirar o input que ficava aqui no final
</form>
</body>
</html>
Fazendo essa mudança acima, após o login você já é redirecionado para a "ListaEmpresas" sem nenhum problema.
Espero que eu tenha ajudado!
Se tiver qualquer problema estarei por aqui :)