Bom dia meus amigos. Estou com um problema ao usar um phaseListener para autenticação e validação de login usando JSF + CDI. Todos os meus beans são gerenciados pelo CDI. Bom, meu CDI está todo configurado bonitinho. O problema é que depois que faço meu Login a minha sessão morre. Não sei como, pois tento pegar meu objeto em Sessão Depois e vem nulo. Alguém consegue me ajudar ? Abaixo vão trechos das minhas classes.
@Named
@SessionScoped
public class LoginMBean implements Serializable {
private static final long serialVersionUID = -8316072987928794508L;
private Usuario usuario;
private Usuario usuarioLogado;
private UsuarioPerfil usuarioPerfilLogado;
Eu tento pegar meu usuario logado na sessão da seguinte forma:
if(usuario != null && usuario.getId() != 0){
usuarioLogado = usuario;
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuarioLogado", usuarioLogado);
return "pagina/dashboard?faces-redirect=true";
}
Aqui vai meu web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Projeto</display-name>
<welcome-file-list>
<welcome-file>login.xhtml</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<resource-env-ref>
<resource-env-ref-name>BeanManager</resource-env-ref-name>
<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>ultima-dark-blue</param-value>
</context-param>
<context-param>
<param-name>primefaces.FONT_AWESOME</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/primefaces-ultima.taglib.xml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>ImageFileServlet</display-name>
<servlet-name>ImageFileServlet</servlet-name>
<servlet-class>com.servlet.ImageFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageFileServlet</servlet-name>
<url-pattern>/ImageFileServlet</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>ttf</extension>
<mime-type>application/font-sfnt</mime-type>
</mime-mapping>
<mime-mapping>
<extension>woff</extension>
<mime-type>application/font-woff</mime-type>
</mime-mapping>
<mime-mapping>
<extension>woff2</extension>
<mime-type>application/font-woff2</mime-type>
</mime-mapping>
<mime-mapping>
<extension>eot</extension>
<mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
<extension>eot?#iefix</extension>
<mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#exosemibold</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#exobolditalic</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#exomedium</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#exoregular</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#fontawesomeregular</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<filter>
<display-name>CharacterEncodingFilter</display-name>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/CharacterEncodingFilter</url-pattern>
</filter-mapping>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<context-param>
<param-name>primefaces.UPLOADER</param-name>
<param-value>commons</param-value>
</context-param>
<error-page>
<error-code>404</error-code>
<location>/pagina/404.xhtml</location>
</error-page>
</web-app>
Aqui vai meu phaseListener que eu uso para autenticar e validar usuario
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
public class LoginListener implements PhaseListener
{
private static final long serialVersionUID = 8816070610930106623L;
public void afterPhase(PhaseEvent event)
{
FacesContext contexto = event.getFacesContext();
String paginaAtual = "";
UsuarioPerfil usuarioPerfil = null;
try
{
paginaAtual = contexto.getViewRoot().getViewId();
paginaAtual = paginaAtual.substring(1, paginaAtual.length());
paginaAtual = paginaAtual.replace(".xhtml", "");
Usuario usuario = (Usuario) Funcoes.getUsuarioLogado(contexto);
UsuarioPerfil usuarioPerfil = (UsuarioPerfil) Funcoes.getUsuarioPerfilLogado(contexto);
if(usuarioPerfil == null){
navegarParaPagina("/?faces-redirect=true",contexto);
Funcoes.adicionarMsg("Você não está logado no sistema", false);
} else
if (paginaAtual.contains("login")){
if(usuarioPerfil.getId() != null && usuarioPerfil.getPerfil() != null && usuarioPerfil.getUsuario() != null){
navegarParaPagina("/pagina/dashboard?faces-redirect=true",contexto);
}
} else
if(usuarioPerfil != null && (usuarioPerfil.getPerfil() == null || usuarioPerfil.getUsuario() == null)){
//navegarParaPagina("/pagina/dashboard?faces-redirect=true");
navegarParaPagina("/login?faces-redirect=true",contexto);
//Funcoes.adicionarMsg("Você não está logado no sistema", false);
} else
if (paginaAtual.contains("/usuario") && !usuarioPerfil.getPerfil().getDescricao().equalsIgnoreCase("administrador"))
{
navegarParaPagina("/pagina/dashboard?faces-redirect=true",contexto);
} else
if (paginaAtual.contains("login") && usuarioPerfil != null){
if(usuarioPerfil.getId() != null && usuarioPerfil.getPerfil() != null && usuarioPerfil.getUsuario() != null){
navegarParaPagina("/pagina/dashboard?faces-redirect=true",contexto);
}
} else
if (paginaAtual.contains("/cliente") && !usuarioPerfil.getPerfil().getDescricao().equalsIgnoreCase("administrador"))
{
navegarParaPagina("/pagina/dashboard?faces-redirect=true",contexto);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void navegarParaPagina(String pagina,FacesContext context)
{
Application app = FacesContext.getCurrentInstance().getApplication();
app.getNavigationHandler().handleNavigation(FacesContext.getCurrentInstance(), null, pagina);
context.renderResponse();
}
public void beforePhase(PhaseEvent arg0)
{
}
public PhaseId getPhaseId()
{
return PhaseId.RESTORE_VIEW;
}
}
Quando eu faço o login ele joga meus objetos na sessão da seguinte forma:
public String login(){
usuario = usuarioService.validaLogin(usuario);
if(usuario != null && usuario.getId() != 0){
usuarioPerfilLogado = usuarioService.carregaUsuarioPerfil(usuario);
usuarioLogado = usuario;
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuarioLogado", usuarioLogado);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuarioPerfilLogado", usuarioPerfilLogado);
logado = true;
validaPermissaoCliente();
validaPermissaoCorretor();
validaPermissaoImovel();
validaPermissaoProprietario();
validaPermissaoUsuario();
return "pagina/dashboard?faces-redirect=true";
}
return null;
}
Bom as configurações em relação ao CDI estão corretas, pois os meus beans de @ConversationScoped funcionam de boa. Agora vem o problema: quando ele faz o login, ele carrega meu objeto usuario e traz as propriedades normais. Porém na navegação do sistema, qualquer tela que eu clicar, quando o meu listener tenta pegar o usuarioLogado do meu bean LoginMBean os valores vem null.
Para se ter uma idéia eu tentei usar a API Servlet na mão e mesmo assim veio nulo. Alguém consegue enxergar onde minha sessão ta morrendo ???