Sou novata em JSF e preciso do conselho dos + experientes.
No sistema que estou tratando, ocorre a seguinte situação: o usuário possui uma sessão de 30 minutos. Após este período de “inatividade”, os objetos ManagedBean que estavam na sessão expiram. Então, qdo o usuário tenta continuar a navegação, uma página de erro é exibida, descrevendo o erro: o ManagedBean ‘X’ não foi encontrado…
Quero tratar este erro de forma que, quando a sessão expirar, o usuário, ao tentar navegar, seja redirecionado para a página de login.
A dúvida é: Como devo fazer isso? Usando Filtro? PhaseListener?
Qual é a maneira correta?
olha ai um codigo que redireciona o usuário apos a sessão ter expirado
importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/** * When the session destroyed, MySessionListener will do necessary logout * operations. Later, at the first request of client, this filter will be fired * and redirect the user to the appropriate timeout page if the session is not * valid. * * Thanks to hturksoy * */publicclassSessionTimeoutFilterimplementsFilter{// This should be your default Home or Login page// "login.seam" if you use Jboss Seam otherwise "login.jsf" / "login.xhtml"// or whateverprivateStringtimeoutPage="index.jsf";publicvoidinit(FilterConfigfilterConfig)throwsServletException{}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainfilterChain)throwsIOException,ServletException{if((requestinstanceofHttpServletRequest)&&(responseinstanceofHttpServletResponse)){HttpServletRequesthttpServletRequest=(HttpServletRequest)request;HttpServletResponsehttpServletResponse=(HttpServletResponse)response;// is session expire control required for this request?if(isSessionControlRequiredForThisResource(httpServletRequest)){// is session invalid?if(isSessionInvalid(httpServletRequest)){StringtimeoutUrl=httpServletRequest.getContextPath()+"/"+getTimeoutPage();System.out.println("Session is invalid! redirecting to timeoutpage : "+timeoutUrl);httpServletResponse.sendRedirect(timeoutUrl);return;}}}filterChain.doFilter(request,response);}/* * session shouldn’t be checked for some pages. For example: for timeout * page.. Since we’re redirecting to timeout page from this filter, if we * don’t disable session control for it, filter will again redirect to it * and this will be result with an infinite loop… */privatebooleanisSessionControlRequiredForThisResource(HttpServletRequesthttpServletRequest){StringrequestPath=httpServletRequest.getRequestURI();booleancontrolRequired=!org.apache.commons.lang.StringUtils.contains(requestPath,getTimeoutPage());returncontrolRequired;}privatebooleanisSessionInvalid(HttpServletRequesthttpServletRequest){booleansessionInValid=(httpServletRequest.getRequestedSessionId()!=null)&&!httpServletRequest.isRequestedSessionIdValid();returnsessionInValid;}publicvoiddestroy(){}publicStringgetTimeoutPage(){returntimeoutPage;}publicvoidsetTimeoutPage(StringtimeoutPage){this.timeoutPage=timeoutPage;}}
importjavax.servlet.http.HttpSession;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;publicclassSessionListenerimplementsHttpSessionListener{publicSessionListener(){}publicvoidsessionCreated(HttpSessionEventevent){}publicvoidsessionDestroyed(HttpSessionEventevent){// get the destroying session…HttpSessionsession=event.getSession();/* * nobody can reach user data after this point because session is invalidated already. * So, get the user data from session and save its logout information * before losing it. * User’s redirection to the timeout page will be handled by the SessionTimeoutFilter. */// Only if neededtry{prepareLogoutInfoAndLogoutActiveUser(session);}catch(Exceptione){System.out.println("Error while logging out at session destroyed: "+e.getMessage());}}/** * Clean your logout operations. */publicvoidprepareLogoutInfoAndLogoutActiveUser(HttpSessionhttpSession){// Only if needed}}