Senhores, desenvolvi uma aplicação com Eclipse, Tomcat7, JSF2 e PrimeFaces3. Está funcionando muito bem mas uma coisa me incomoda. Sempre que a session termina e tento abrir uma página, recebo um erro tipo:
HTTP Status 500 -
type Exception report
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606
root cause
java.lang.StackOverflowError
java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
Isso é muito chato. O cliente vai entender nada, né?
Já tentei de todas as formas redirecionar o usuário para a tela de login, mas não funciona. Já li e tente implementar código com PhaseListener. E também não funcionou, talvez por erro meu que sou novo em JSF e ainda não entendi certos tópicos.
Em resumo, alguém pode me ajudar a evitar essa tela cheia de linhas de erros tomcat e fazer um redirecionamento decente para um tela de (Re) login?
Um abraço
Caramba, Polverini! Quase! Está faltando pouco. Estou lutando com o erro que apareceu:
viewId:/views/ppgLogin.jsf - A exibição de /views/ppgLogin.jsf não pôde ser restaurada.]
with root cause
javax.faces.application.ViewExpiredException: viewId:/views/ppgLogin.jsf - A exibição de /views/ppgLogin.jsf não pôde ser restaurada.
Tenho um phaselistener que pega a sessao (se nao existir ele cria) e procura um atributo (ex. id), caso nao exista o atributo eu faço um forward para a tela de login, desta forma quando ele enviar o cliente para tela de login já existira uma sessão nova criada.
Quando a redirect e forward tbm indico algumas informações do rpontes que é show de bola:
se der depois posta ai como deixou as configurações e o pq !!
Abraço
I
isotropic
Polverini, pelo menos neste primeiro momento, deixarei assim como funcionou. Testei outras soluções mas sempre há um erro. Seja de stack, seja de view ViewExpiredException… Assim ao menos funciona. Valeu pela ajuda. Obrigado mesmo.
Boa noite e que Ele ilumine a nossa semana.
Abraços
I
isotropic
bem, senhores, no fim ficou assim:
publicclassAutorizaListenerimplementsPhaseListener{publicvoidafterPhase(PhaseEventevent){FacesContextcontexto=event.getFacesContext();// Obtém o contexto atual StringpaginaAtual=contexto.getViewRoot().getViewId();// Obtém a página que atualmente está interagindo com o ciclo booleanisLoginPage=paginaAtual.lastIndexOf("pgLogin.xhtml")>-1;// Se for a página 'login.jsp' seta a variável como true HttpSessionsessao=(HttpSession)contexto.getExternalContext().getSession(true);// Obtém a sessão atual usuarioBeanusuario=(usuarioBean)sessao.getAttribute("USER_OK");// Restaga o nome do usuário logadoif(!isLoginPage&&usuario==null){// Redireciona o fluxo para a página de loginNavigationHandlernh=contexto.getApplication().getNavigationHandler();nh.handleNavigation(contexto,null,"logout");}}publicvoidbeforePhase(PhaseEventevent){}publicPhaseIdgetPhaseId(){returnPhaseId.RENDER_RESPONSE;}}
Funcionou direitinho. Quando termina a sessão e o usuário tenta abrir uma página, ele é redirecionado para a página de login.
O único efeito colateral é que, na tela de (re) login, o usuário tem clicar duas vezes no botão login... rs... Fazer o quê, né?...
Um abraço e obrigado a todos que me auxiliaram nesta.