qnd este tempo expira e o usuario tenta utilizar algum recurso o container lanca uma javax.faces.application.ViewExpiredException.
ate aqui td bem… porem eu quero fazer o seguinte…
qnd expirar a sessão e o usuario tentar fazer um request… alem de aparecer a tela de erro ele seja redirecionado para tela de login…
eu não estou conseguindo fazer isto… ja tentei fazer filtro… ja tentei capturar a exception…
e nada…
eu gostaria da ajuda de vcs!!!
como devo proceder para implementar corretamente a sessão?
como consigo redirecionar para a pagina de login?
Olha, pelo menos no ajax4jsf era só você sobreescrever uma função javascript que estava tudo dominado
A4J.AJAX.onExpired=function(loc,expiredMsg){if(window.confirm("A sua sessão expirou! Deseja recarregar a página?!")){returnloc;}else{returnundefined;}};
Onde loc é a página que você estava, você pode colocar a URL da tua página de login!
surfzera
dae, faz o seguinte usa o FhaseListener
coloca no seu Faces-Config - apontando para a pasta que esta a classe
br.com.simct.util.AutorizadorPhaseListener
cria uma classe PhaseListener
public class AutorizadorPhaseListener implements PhaseListener {
//Chama a pagina que quer direcionar após a sessa expirarpublicstaticfinalStringloginPage="/template.jsf";publicvoidafterPhase(PhaseEventevent){try{FacesContextfc=event.getFacesContext();if(fc.getViewRoot().getViewId().equals(loginPage)){return;}ELResolverelr=fc.getApplication().getELResolver();NavigationHandlernav=fc.getApplication().getNavigationHandler();nav.handleNavigation(fc,null,"login");}catch(Exceptione){// Não há necessidade de informar erro}}publicvoidbeforePhase(PhaseEventarg0){ExternalContextcontext=FacesContext.getCurrentInstance().getExternalContext();HttpServletRequestrequest=(HttpServletRequest)context.getRequest();if(!request.getRequestURL().toString().endsWith(loginPage)&&context.getSession(false)==null){try{context.redirect(request.getContextPath()+loginPage);}catch(IOExceptione){// Não há necessidade de informar erro}}}publicPhaseIdgetPhaseId(){returnPhaseId.RESTORE_VIEW;}
}
Jeferson_Manetti
hum…
gostei! parece ser simples =)
porem nunca fiz algo assim =)
vc me disse pra sobrescrever a função… como faço isso?
tipo… onde devo colocar esse trecho q vc me passou?
em um .properties, no DD, faces-config?
dai como ficaria na minha pagina?
suponhamos q eu tenho as seguintes paginas…
login.jsp e uma outra pagina tipo show.jsp…
fiquei 40 min na show.jsp e minha sessão expirou…
como eu faria?
=)
t+ abraços
Jeferson_Manetti
iaew surfzera blz?
tenho um listener parecido com esse porem não implementei o beforePhase...
eu utilizo para não deixar alguem tentar acessar qlq pagina sem estar logado no sitema...
bom... eu implementei o beforePhase mais começou a dar erro..
java.lang.RuntimeException: Cannot find FacesContext
da uma olhada no meu listener:
publicclassAutorizarUsuarioimplementsPhaseListener{privatestaticfinallongserialVersionUID=1L;publicstaticfinalStringLOGIN_PAGE="/login/index.jsp";@OverridepublicvoidafterPhase(PhaseEventevent){FacesContextfacesContext=event.getFacesContext();// Verifica se é a pagina de loginif(facesContext.getViewRoot().getViewId().equals(LOGIN_PAGE)){return;}// Obtem uma referencia para o autenticador na sessãoELResolverelResolver=facesContext.getApplication().getELResolver();LoginHandlerlogin=(LoginHandler)elResolver.getValue(facesContext.getELContext(),null,"loginHandler");if(login==null||!login.isLogado()){System.out.println("Não esta Logado");// Redireciona para o LoginNavigationHandlernavigationHandler=facesContext.getApplication().getNavigationHandler();navigationHandler.handleNavigation(facesContext,null,"login");// Renderiza a PaginafacesContext.renderResponse();}}@OverridepublicvoidbeforePhase(PhaseEventevent){// aqui utilizei oq vc me passouExternalContextcontext=FacesContext.getCurrentInstance().getExternalContext();HttpServletRequestrequest=(HttpServletRequest)context.getRequest();if(!request.getRequestURL().toString().endsWith(LOGIN_PAGE)&&context.getSession(false)==null){try{context.redirect(request.getContextPath()+LOGIN_PAGE);}catch(IOExceptione){}}}@OverridepublicPhaseIdgetPhaseId(){returnPhaseId.RESTORE_VIEW;}}
oq sera q estou fazendo de errado?
da uma forcinha ai =)
vlw
surfzera
cara não entendi do modo que eu fiz funciona perfeitamente para qualquer aplicacao. Não entendi ainda porque do cheito que você implementou esta dando erro…
Jeferson_Manetti
iaew galera!
esse problema de java.lang.RuntimeException: Cannot find FacesContext eu consegui resolver…
fiz um mapeamento para *.faces portanto meu loginPage aparece assim /login/index.faces…
a solução foi criar uma costante com o falor de login page assim “/login/index.faces” e funcionou…
porem surgiu 2 problema…
1 - qnd a sessão expira na pagina de login da erro (ViewExpiredException)… =(
não entendi…
2 - este não e um erro e sim um WARRING… porem todo aviso pode virar um erro…
qnd estou em qlq pagina (menos a de login) e expira a sessão ele redireciona pra pagina de login… perfeito!
porem percebi q ele gera um WARRING… no console…
segue:
este negocio ta me dando quebrando…
ah… segue meu listener novamente:
publicclassAutorizarUsuarioimplementsPhaseListener{privatestaticfinallongserialVersionUID=1L;publicstaticfinalStringLOGIN_PAGE="/login/index.jsp";publicstaticfinalStringLOGIN_PAGE_FACES="/login/index.faces";@OverridepublicvoidafterPhase(PhaseEventevent){FacesContextfacesContext=event.getFacesContext();// Verifica se é a pagina de loginif(facesContext.getViewRoot().getViewId().equals(LOGIN_PAGE)){return;}// Obtem uma referencia para o autenticador na sessãoELResolverelResolver=facesContext.getApplication().getELResolver();LoginHandlerlogin=(LoginHandler)elResolver.getValue(facesContext.getELContext(),null,"loginHandler");if(login==null||!login.isLogado()){System.out.println("Não esta Logado");// Redireciona para o LoginNavigationHandlernavigationHandler=facesContext.getApplication().getNavigationHandler();navigationHandler.handleNavigation(facesContext,null,"login");// Renderiza a PaginafacesContext.renderResponse();}}@OverridepublicvoidbeforePhase(PhaseEventevent){ExternalContextcontext=FacesContext.getCurrentInstance().getExternalContext();HttpServletRequestrequest=(HttpServletRequest)context.getRequest();if(!request.getRequestURL().toString().endsWith(LOGIN_PAGE_FACES)&&context.getSession(false)==null){try{context.redirect(request.getContextPath()+LOGIN_PAGE_FACES);}catch(IOExceptione){}}}@OverridepublicPhaseIdgetPhaseId(){returnPhaseId.RESTORE_VIEW;}}
surfzera
tenta tirar essa parte porque automaticamente já estara apontando para tela de login caso a session va pro bebeleu…
if ( login == null || ! login.isLogado() ) {
System.out.println( "Não esta Logado" );
// Redireciona para o Login
NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
navigationHandler.handleNavigation( facesContext, null, "login" );
// Renderiza a Pagina
facesContext.renderResponse();
}
surfzera
ops nao vi sua resposta anterior…vou tentar aqui pra ver se o meu da erro tambem que vc falou.