possuo páginas restritas aos usuários logados, tenho um filtro que acessa ao bean (um bean @SessionScoped) e ver se o usuário tá logado, se n, redireciona para o login
o problema é, quero q ao carregar a página apareça o growl com uma determinada mensagem,
vi a anotação @URLMapping no bean onde relacionava-se valores vindo da url a atributos do bean isso poderia resolver meu problema, porém ela nem é reconhecida aqui
eu tb n queria ter um método q executasse toda vez q o bean fosse requisitado pelo browser
imagino q eu tenha chegado perto com o PhaseListener
entretanto
entretanto, esse PhaseListener é executado em toda requisição do browser, e eu n vi onde usar um mapeamento nele e definir um url-pattern, portanto, n estou inclinado a usa-lo
o meu filtro atualmente está assim:
como dizia Carlos Drummond de Andrade
“E agora José?”
consegui quase tudo q eu queria com o PhaseListener assim:
[code]/*
- To change this template, choose Tools | Templates and open the template in
- the editor.
*/
package utilidades;
import beans.portal.PortalGenerico;
import javax.faces.application.FacesMessage;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;
/**
*
-
@author Thiago
*/
public class Treta implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
String currentPage = event.getFacesContext().getViewRoot().getViewId();
if (currentPage.contains(“administrador”)) {
System.out.println(“estamos em área restrita”);
if (((PortalGenerico) ((HttpSession) event.getFacesContext().getExternalContext().getSession(false)).getAttribute(“portalGenerico”)) != null) {
System.out.println(“a bena portal genérico já foi instanciado”);
if (((PortalGenerico) ((HttpSession) event.getFacesContext().getExternalContext().getSession(false)).getAttribute(“portalGenerico”)).logado()) {//o usuário está logado?
System.out.println(“deu como logado”);
event.getFacesContext().getApplication().getNavigationHandler().handleNavigation(event.getFacesContext(), null, event.getFacesContext().getViewRoot().getViewId());
} else {
event.getFacesContext().addMessage(null, new FacesMessage(“Não está logado”, “”));
event.getFacesContext().getApplication().getNavigationHandler().handleNavigation(event.getFacesContext(), null, “…/login.xhtml”);
}
} else {
event.getFacesContext().addMessage(null, new FacesMessage(“Não está logado”, “”));
event.getFacesContext().getApplication().getNavigationHandler().handleNavigation(event.getFacesContext(), null, “…/login.xhtml”);
}
} else {
event.getFacesContext().getApplication().getNavigationHandler().handleNavigation(event.getFacesContext(), null, event.getFacesContext().getViewRoot().getViewId());
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
@Override
public void beforePhase(PhaseEvent event) {
}
}
[/code]
porém a url da página n muda ela muda com o
event.getFacesContext().getExternalContext().redirect("../login.xhtml");
porém o growl n funfa quando a url funfa
não sei quanto ao ciclo de vida mas tente mandar a mensagem depois de redirecionar a pagina
event.getFacesContext().getExternalContext().redirect("../login.xhtml");
event.getFacesContext().addMessage(null, new FacesMessage("Não está logado", ""));
caso não de certo vc pode criar uma condição que em determinada fase do jsf ele dispare a mensagem. ex. Fase X mensagem.lenght() > 0 {addMesage()}
só não sei dizer qual seria a fase
imagino q eu já tinha tentado isso, tentei de novo para confirmar, e n deu certo
tenta adicionar a mensagem quando a fase for 6, caso queira ver outras tem aqui
http://marcusmazzo.wordpress.com/2008/12/13/ciclo-de-vida-jsf/
eu imagino q add a mensagem na etapa 6 fica assim:
[code]/*
- To change this template, choose Tools | Templates and open the template in
- the editor.
*/
package utilidades;
import beans.portal.PortalGenerico;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
-
@author Thiago
*/
public class FiltroAdministrador implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (((HttpServletRequest) request).getSession(false) != null) {
if (((PortalGenerico) ((HttpServletRequest) request).getSession(false).getAttribute(“portalGenerico”)).logado()) {
chain.doFilter(request, response);
} else {
//fazendoBobagem = boleano q indica que o usuário está tentando acessar a área restrita
((PortalGenerico) ((HttpServletRequest) request).getSession(false).getAttribute(“portalGenerico”)).fazendoBobagem = true;
((HttpServletResponse) response).sendRedirect("…/login.xhtml");
}
} else {
((PortalGenerico) ((HttpServletRequest) request).getSession(false).getAttribute(“portalGenerico”)).fazendoBobagem = true;
((HttpServletResponse) response).sendRedirect("…/login.xhtml");
}
}
@Override
public void destroy() {
}
}
[/code]
Filter este q só é executado quando a url seja /portal/administrador/*
que no meu caso é a área restrita
e pra add a mensagem basta no login.xhtml ser chamado o método que confere a “bobagem” e mostra uma mensagem se for true
#{portalGenerico.confere()}
e no bean
public void confere(){
if(fazendoBobagem){
SessionUtil.addErrorMessage("loguese");
}
}
isso resolve o problema, e ao meu ver cria outro
pq assim toda vez q página for requisitada será executado o método confere(), o q ao meu leigo ver n é muito inteligente
porém se eu pudesse chamar o confere no filter
usei essa classe aqui
http://ocpsoft.com/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/
n funcionou
se eu soubesse fazer essa “jogada” dentro de um servlet, talvez conseguisse, porém n sei como fazer com q o servlet renderize o login.xhtml
tô pra desistir e deixar como está, executando o método confere() a cada requisição
Boa noite!
Thiago, estou com a mesma situação que a sua: precisando redirecionar, e depois exibir o growl… Conseguiu alguma solução?
Até +!
buenas vinnysoft
resumidamente eu tenho um boolean no bean que gere a sessão, inicialmente setado como false
ao tentar acesso onde n há permissão o meu filter seta true no boolean, e endereça pra login page
na login page tenho uma injeção livre, ou seja, em qualquer lugar da página referenciando o método que confere o tal boolean
se o boolean is true dispara mensagem e seta boolean false, se n, n faz nada
espero que consiga