[RESOLVIDO] Problemas com @SessionScoped CDI

3 respostas Resolvido
jsf
R

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 ???

3 Respostas

D

Mas não é este o comportamento esperado? Loga, a sessão expira, tudo morre?
Ou o problema está em, depois de ter a sessão expirada, logar novamente e não ter mais acesso?

R

Talvez não esteja entendendo. Quando eu logo, eu preciso do objeto usuario para poder pegar as permissões dele e tudo mais. E então o que acontece é que: quando o usuario loga. E eu vou navegar no sistema, o meu ManagedBean de Sessão já morreu. Veja que o ManagedBean é do tipo SessionScoped, ou seja, é para manter o estado dele enquanto a sessão estiver ativa. E então não sei porque na verdade, depois que ele se loga, a sessão morre ou algo do tipo. Não vem nada nela. Entende ?

R
Solucao aceita

Amigos problema resolvido. O erro não estava na minha estrutura de beans, nem no escopo e nem no JSF. O problema é que o meu botão de logout estava dessa forma:

<li>
                                <a href="#{loginMBean.logout()}" class="ripplelink">
                                    <i class="material-icons">&#xE8AC;</i>
                                    <span>Logout</span>
                                </a>
                            </li>

e por este motivo toda requisição minha após dar o login executava o “logout” e com isso dava um invalidate na minha sessão e assim por diante.

e a solução foi alterar para:

<li>
                            	<h:commandLink styleClass="ripplelink" action="#{loginMBean.logout()}">
                                    <i class="material-icons">&#xE8AC;</i>
                                    <span>Logout</span>
                                </h:commandLink>
                            </li>
Criado 6 de fevereiro de 2017
Ultima resposta 11 de fev. de 2017
Respostas 3
Participantes 2