Erro ao tentar fazer Logout

Bom galera, estou com um problema teoricamente fácil de resolver porém já rodei tudo o que era lugar e não consigo resolver esse problema. Tenho uma aplicação que consegue fazer o login normalmente, na qual abre a sessao corretamente, só que quando clico no botão de logout nada acontece, no console ele mostra a página que é pra ir só que não redireciona para ela, segue o código abaixo.

LoginBean

import javax.enterprise.inject.Alternative;
import javax.faces.application.FacesMessage;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

import org.primefaces.context.RequestContext;
import br.unipe.akropolis.business.UsuarioBC;
import br.unipe.akropolis.domain.Usuario;
import br.unipe.akropolis.util.FacesUtil;
import br.unipe.akropolis.util.GerenciadorSessao;
import br.gov.frameworkdemoiselle.annotation.NextView;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.security.Authenticator;
import br.gov.frameworkdemoiselle.security.User;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@Alternative
@SessionScoped
@ViewController
@NextView("/index.xhtml")
@PreviousView("/login.xhtml")
public class LoginBean extends AbstractPageBean implements Authenticator{

	private static final long serialVersionUID = 1L;

	@Inject
	UsuarioBC usuarioBC = new UsuarioBC();
		
	private String nomeUsuario;
	
	private String senha;
	
	@Inject 
	private Usuario usuario;
	
	public String getNomeUsuario() {
		return nomeUsuario;
	}

	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getLogin() {
		return "";
	}
	
	@Transactional
	public String login() {
		RequestContext requestContext = RequestContext.getCurrentInstance();
		FacesMessage msg = null;
		boolean loggedIn = false;
		
		if(authenticate()) {
			if (usuario != null) {
				loggedIn = true;
				String nome = usuario.getPessoaFisica().getPessoa().getNome();
				msg = new FacesMessage(FacesMessage.SEVERITY_INFO, ("Seja bem-vindo(a), " + nome), null);
				FacesContext.getCurrentInstance().addMessage(null, msg);
				//context.addCallbackParam("loggedIn", loggedIn);
				System.out.println("GETCURRENTVIEW: " + getCurrentView());
				System.out.println("GETNEXTVIEW: " + getNextView());
				GerenciadorSessao.abrirSessao(usuario);
				System.out.println("Sessao: " + GerenciadorSessao.getUserSession());
				return getNextView();
			}
			else {
				loggedIn = false;
				msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro de login", "Login e/ou senha não conferem.");
			}
		} else {
			loggedIn = false;
			msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro de login", "Credenciais inválidas.");
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
		return getCurrentView();
	}

	@Override
	public boolean authenticate() {
		if(nomeUsuario != null  && senha != null) {
			usuario = usuarioBC.getUsuario(nomeUsuario, senha);
			return true;
		}
		return false;
	}

	@Override
	public void unAuthenticate() {
		usuario.limpar();
		
	}

	@Override
	public User getUser() {
		return new User() {

			private static final long serialVersionUID = 1L;

			@Override
			public String getId() {
				return usuario.getLogin();
			}

			@Override
			public void setAttribute(Object key, Object value) {
				usuario.setLogin((String)value);
			}

			@Override
			public Object getAttribute(Object key) {
				return usuario.getLogin();
			}
		};
	}
	
	public String efetuarLogout() {
		boolean resultado = GerenciadorSessao.fecharSessao();
		if (!resultado) {
			System.out.println("--------------ENTREI NO IF--------------");
			return null;
		}
		System.out.println("--------------NÃO ENTREI NO IF, MAS NÃO ESTOU FAZENDO O LOGOUT PQ??????????--------------");
		System.out.println("CurrentView: " + getCurrentView());
		return getPreviousView();
	}

}

Botão de Logout

<p:submenu label="Logout">
     <p:menuitem value="#{messages['menu.menuitem.quit']}" 
	   action="#{loginBean.efetuarLogout}"/>
 </p:submenu>

Desde já agradeço a ajuda.

 boolean resultado = GerenciadorSessao.fecharSessao();  

fecharSessao()

o q esse cara faz?

att,

Pedro,

o fecharSessao(), serve para fechar a sessao do usuário segue o código abaixo

public static boolean fecharSessao() {
		boolean result = false;
		HttpSession session = FacesUtil.obterSessao();
		System.out.println("session está null? " + session == null);
		if (session != null) {
			session.removeAttribute("uid");
			session.invalidate();
			result = true;
		}
		return result;
	}

O metodo getPreviousView traz alguma coisa

Seguinte voce esta utilizando primefaces não é ?

Se for os componentes do prime por padrão utiliza ajax, que significa que voce não consegue redirecionar para uma página

Tente colocar a tag ajx=false no seu p:menuitem

ou adicione o seguinte codigo depois do caminho da sua tela

 return getPreviousView() + "?faces-redirect=true";

Ele traz a pagina login.xhtml, sim estou usando o prime.

Coloquei o ajax=false mais nao funcionou inclusive já tinha testado com ele e nao pegou.

Utilizando o “?faces-redirect=true” funcionou, só não entendi o que ele faz direito, poderia me explicar por favor?

Desde já agradeço a ajuda de vocês com esse problema que foi resolvido, muito obrigado.

Segue a explicação do redirect
http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward

  1. No seu método de finalizar sessão vc não precisa da linha session.removeAttribute(“uid”); pois uma vez que vc chama o invalidate o servidor mata tudo que está na sessão.

  2. Esse seu método getPreviousView() está retornando o valor correto?