PhaseListener + gerencia de usuários + saber página destino, preciso URGENTE!

Olá amigos, boa tarde.
Desenvolvi um AutorizacaoListener com as fases: afterPhase(PhaseEvent event), beforePhase(PhaseEvent event) e public PhaseId getPhaseId().

Estou precisando implementar algo que controle a navegação do usuário, ou seja, se um usuário não logou ele não consegue abrir determinada página.

Outra coisa seria para o carregamento de uma lista de professores, que se comporta de maneira diferente, ou seja, se a página chamada for de inclusao (incluirCursos.jspx) ele monta essa lista de determinada forma, caso seja (alterarCursos.jspx) a lista é montada de outra forma. Porém eu não sei como obter a página que foi chamada após o redirecionamento(página destino), eu consigo pegar apenas a página atual (página origem).
FacesContext facesContext = event.getFacesContext();
String currentPage = facesContext.getViewRoot().getViewId();

Alguém poderia me ajudar nessa questão? Mandar um PhaseListener com esses métodos implementados e como pegar a página destino no meu controlador de cursos na montagem da lista?
Estou desenvolvendo o sistema de controle acadêmico para o meu tcc, porém fiz umas modificações para melhorar a manutenibilidade, onde existe um form apenas para cada caso de uso, e tô precisando disso com uma certa urgência, quem puder me ajudar, será de grande autoria. :slight_smile:

Agradeço desde já,
Abraços,
Lessandro

Olá, estes dois posts devem resolver seu problema:


http://ciromacedo.blogspot.com/2008/06/controle-de-acesso-no-jsf.html

Isso acontece porque você está interceptando na afterPhase da fase 1-Restore View, por isso a pagina ainda é a atual e não a que o usuario requisitou.
Experimente fazer um listerner interceptando todas as fases, e imprimindo a pagina atual, para ver o que acontece.

Antes leia esse tutorial sobre Debug JSF Lifecycle

Valeu!

Obrigado amigo.
Sua dica será de grande ajuda.
Estarei dando uma lida nesses tuturiais, e assim q conseguir algo concreto, dou uma resposta aki
Abraços
Mais uma vez, obrigado pela atenção
Att,
Lessandro

Fala pessoal, boa dia.
Segui os passos do tutorial, e a questão do controle de páginas e usuários estão funcionando.
Porém não estou conseguindo pegar no meu controller de cursos por ex:
Eu criei uma variavel com o nome de paginaChamada la no Listener onde ao passar no beforePost ele seta o valor
dessa variável para a página redirecionada no momento, so que ao tentar pegar no controller ela está null.

FaseListener listener = new FaseListener();
String paginaChamada = listener.getPaginaChamada();
if (paginaChamada.equals(“incluirCursos.jspx”) {
preenche a lista de um jeito
}
else
preenche de outro

Como pegar o valor dessa variavel no meu controller à medida que o Listener for sendo modificado com a navegação da página destino no meu controller?
Agradeço desde já,
Att,
Lessandro

Olá, leadro realmente eu não entendi o que você quer fazer.

FaseListener listener = new FaseListener(); 
String paginaChamada = listener.getPaginaChamada(); 
if (paginaChamada.equals("incluirCursos.jspx") { 
preenche a lista de um jeito 
} 
else 
preenche de outro 

De onde saiu essa classe FaseListener?

Faz o seguinte, coloque o codigo completo aqui.

A FaseListener é o nome da minha classe que extende a PhaseListener:
Segue abaixo:

package br.com.sca.utils;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

import br.com.sca.model.Usuario;

public class FaseListener implements PhaseListener {

	private static final long 	serialVersionUID = 1L;
	
	public FaseListener() {
	}

	public void afterPhase(PhaseEvent event) {
		/* Manipula uma notificação que está procesando uma fase do ciclo de vida JSF quando este já completou. */ 
		FacesContext ctx = event.getFacesContext();
		if(event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
			String paginaAtual = ctx.getViewRoot().getViewId();
			boolean paginaLogin = (paginaAtual.lastIndexOf("login.jspx") > -1);
			Usuario usuario = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado");
			if (usuario == null && !paginaLogin) {
				NavigationHandler nh = ctx.getApplication().getNavigationHandler();
				nh.handleNavigation(ctx, null, "paginaLogin");
			}
			if (ctx.getViewRoot() != null) {
				FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("paginaDestino", ctx.getViewRoot().getViewId());  
			}
		}
		else
			System.out.println(ctx.getViewRoot().getViewId());
			
	}

	public void beforePhase(PhaseEvent event) {
		/* Manipula uma notificação que está procesando uma fase do ciclo de vida JSF quando este está prestes a iniciar. */ 
			FacesContext ctx = event.getFacesContext();
			if (ctx.getViewRoot() != null)
				System.out.println(ctx.getViewRoot().getViewId());
	}

	public PhaseId getPhaseId() {
		/* Retorna o Tipo de Fase no JSF que o objeto será notificado. Pode ser qualquer uma das 6 fases, ou todas as fases. */ 
		return PhaseId.ANY_PHASE;
	}
}

Contudo, em nenhum momento ao chamar a página incluirCursos.jspx ele retorna para mim essa página no controller de Cursos, pois eu preciso fazer uma verificação se a página é de inclusao ou alteração para montar uma lista de forma diferente. Entendo também que se eu der um New la no controller, estarei criando uma instância nova do Listener, e resolvi fazer dessa forma acima, passando para um scopo que eu consiga recuperá-lo depois. Mas nem no afterPost nem no beforePost ele retorna a página incluirCursos.jspx ou alterarCursos.jspx.

Abraços,
Att,
Lessandro

Estava debugando aqui, e verifiquei que apenas qdo o form, ou seja, o jspx de incluirCursos é aberto que ele consegue enxergar a pag. no getViewRoot().getViewId();
Por isso o controller não consegue enxergar a página incluirCursos.jspx apenas a anterior exibirCursos.jspx.
Porém eu preciso saber qual a página chamada no momento que é feito o redirect, ou seja, antes de abrir a página, durante a chamada do botão “Incluir” cursos.
Se alguém tiver uma idéia…
Abraços
Lessandro