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?
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();
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:
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?
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>
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?