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