Escrevi o código da aula para implementar o Autorizador e quando fui testar está dando o erro "Redirecionamento em excesso por localhost" ao tentar acessar qualquer um dos xhtml (livro, autor, login). Revisei todo o código mas não consegui identificar onde está o problema, alguma idéia ?
Desde já obrigado.
//***********************Autorizador.java********************
package br.com.caelum.livraria.util;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import br.com.caelum.livraria.modelo.Usuario;
public class Autorizador implements PhaseListener {
private static final long serialVersionUID = -7243482575488562717L;
@Override
public void afterPhase(PhaseEvent evento) {
FacesContext context = evento.getFacesContext();
String nomePagina = context.getViewRoot().getViewId();
if("login.xhtml".equals(nomePagina)) {
return;
}
Usuario usuarioLogado = (Usuario) context.getExternalContext().getSessionMap().get("usuarioLogado");
if(usuarioLogado != null) {
return;
}
// Redirecionamento para login.xhtml
NavigationHandler handler = context.getApplication().getNavigationHandler();
handler.handleNavigation(context, null, "/login?faces-redirect=true");
context.renderResponse();
}
@Override
public void beforePhase(PhaseEvent event) {
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
//************************Bean************************
package br.com.caelum.livraria.bean;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import br.com.caelum.livraria.dao.UsuarioDAO;
import br.com.caelum.livraria.modelo.Usuario;
@ManagedBean
@ViewScoped
public class LoginBean {
private Usuario usuario = new Usuario();
public Usuario getUsuario() {
return usuario;
}
public String efetuarLogin() {
System.out.println("Fazendo Login do Usuario" +this.usuario.getEmail());
Boolean existe = new UsuarioDAO().existe(usuario);
if(existe) {
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getSessionMap().put("usuarioLogado", this.usuario);
return "livro?faces-redirect=true";
}
return null;
}
}
//**************************** login.xhtml ************************
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head />
<ui:composition template="_template.xhtml">
<ui:define name="titulo">
Login
</ui:define>
<ui:define name="conteudo">
<h:form>
<fieldset>
<legend>Login</legend>
<h:panelGrid columns="3">
<h:outputLabel value="e-mail:" for="email" />
<h:inputText id="email" value="#{loginBean.usuario.email}" required="true" >
<f:passThroughAttribute name="type" value="email"/>
</h:inputText>
<h:message for="email" id="messageEmail" />
<h:outputLabel value="senha" for="senha" />
<h:inputText id="senha" value="#{loginBean.usuario.senha}" required="true" >
<f:passThroughAttribute name="type" value="password" />
</h:inputText>
<h:message for="senha" id="messageSenha" />
<h:commandButton value="Efetue Login" action="#{loginBean.efetuarLogin}" />
</h:panelGrid>
</fieldset>
</h:form>
</ui:define>
</ui:composition>
</html>