Logout/Sair do sistema - JSF 2.0

Quando utilizava JSF 1.2 eu fazia algo do tipo para realizar logout do usuário:

public String logout() {		
  FacesContext fc = FacesContext.getCurrentInstance();
  ValueExpression vb = fc.getApplication().getExpressionFactory().createValueExpression(fc.getELContext  (), "#sessionScope.userBean}", Usuario.class);
  vb.setValue(fc.getELContext(), null);
  return "logout";
}

1 - Queria saber se em JSF 2.0 tem algo mais direto para quando clicarmos num botão “logout” não ter que usar um ValueExpression.

2 - Caso eu coloque uma opção “Sair” disponível em qualquer parte do programa. Qual seria a melhor alternativa para “matar” tudo, ou seja, realmente finalizar toda a sessão e obrigar o usário a logar novamente?

agradeço

veja a dica do JavaUbuntu.
http://www.guj.com.br/posts/list/83834.java

ela eh o suficiente, para matar tudo :D.

flw

Valeu!!!

Interessante é que o seguinte código parou de “matar” a sessão e tinha chegado a funcionar anteriormente, ou seja, estou chamando este código(que está dentro de um metodo em um managed bean) de um commandlink, ele chama o metodo e redireciona para página principal mas mesmo assim ainda consigo acessar os dados que estavam “guardados” nos managed beans (fiz uns testes com uns System.out.println e vi que os objetos/atributos não foram destruidos)…e olha que eles estão com o escopo de sessão mesmo. Segue o código:

FacesContext fc = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession)fc.getExternalContext().getSession(false); session.invalidate();

Alguém tem alguma ideia?

Peguei o “id” e a “data da criação” da sessão, no inicio e antes da finalização do sistema (antes de chamar o invalidade) e teoricamente está tudo certo. É como se o invalidade não matasse os itens que estão na sessão. Para ter uma ideia do que estou falando vou colocar os codigos envolvidos:

Código presente no XHTML:

<h:commandLink action="#{beanUtilitario.logout}" immediate="true"> <h:outputText rendered="#{usuarioBean.usuario.login != null}" styleClass="fdireita" value="Sair"/> </h:commandLink>

e o código do metodo logout presente no Bean:

public String logout() { FacesContext fc = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession)fc.getExternalContext().getSession(false); session.invalidate(); return "index.xhtml"; }

mesmo após pressionar o botão “Sair” o link fica disponível e o usuário que tava “pendurado” na sessão ainda está lá, usei uns System.out para verificar isso…Alguém já passou por isso?

1 curtida

Fala cluiz, aqui eu uso JSF2 e prescisei fazer apenas isso aqui.

//MÉTODO Mb.

   public String logout() {
      HttpSession sessao = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
      sessao.invalidate();
      return "login"; //AQUI EU PASSO O NOME DA MINHA TELA INICIAL.
    }

//LINK DA TELA

                            <p:commandLink id="lnkLogout"
                                           style="color: black; font-size: 14px"
                                           value="Logout"
                                           action="#{mbLogin.logout}"
                                           ajax="false">
                            </p:commandLink>

Espero que isso ajude.

Na verdade o meu está quase assim mas por via das dúvidas coloquei igual ao seu e quando eu consulto o Usuario no managedbean ele está lá…é como se o session.invalidade() não funcionasse…visto que o objeto usuário ainda tem os dados mesmo após o invalidade…

Acho que é devido ao GlasshFish, visto que chegou a funcionar e parou do nada. Achei este tópico depois de muito procurar e acho que deva ser a mesma coisa…

Oi, eu não sou nenhum expert em JSF. Mas conversando com um colega surgiu uma dúvida: fazendo isso desta maneira não vai deixar o ciclo de vida do JSF incompleto? Se sim, existe algum problema/consequência negativa em fazer isso?

Obrigado :wink: