Galera, tenho uma aplicação web que em determinado tempo de inatividade, tem um timeout e perde a sessão.
Eu gostaria de fazer duas coisas:
-
Ao dar o timeout, ele gravar em banco o momento em que aconteceu. (Já tenho um método estático pronto. Só não sei aonde encaixar)
-
Após o timeout, redirecionar para a página inicial de login.
Imagina que isso seja ridículo de fazer rs, mas não estou encontrando uma maneira de fazer isso…
Só pra saber, estou utilizando JSF e faço o controle de acesso com Filter.
Não sei se é possivel mas da uma pesquisade se tem como fazer um filtro para isso, igaul ao de login mas para essa situação
so consiguo imaginar fazer com filtro e naum sei se tem como ainda é so uma ideia
Sim sim, eu consegui fazer parte disso pelo Filter…
Mas por exemplo quando dá TimeOut e ele redireciona pra página de login, aparece essa mensagem:
javax.servlet.ServletException: viewId:/publico/login.jsf - A exibição de /publico/login.jsf não pôde ser restaurada.
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:521)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at br.gov.inpi.prgguardtec.web.filter.LoginFilter.doFilter(LoginFilter.java:38)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.application.ViewExpiredException: viewId:/publico/login.jsf - A exibição de /publico/login.jsf não pôde ser restaurada.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:200)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)
... 22 more
Inves de redirecionar se voce abrisse uma nova aba, e fechasse a atual, quem sabe da certo,
Eu consegui redirecionar quando dá o timeout… Mas acontece que quando a sessão expira, eu perco todos os dados do usuário e não tenho como registrar em Log…
Suponhamos que o time da session seja 5 minutos
coloque um timer na aplicação de 4 minutos e 45 segundos
a cada interação que o usuario fazer na aplicação voce zera o timer atual e dispara de novo,
loguei no sistema, dispara o timer de 4 min e 45 seg
passou 1 min, ai eu abri o cadastro de cliente, o timer é voltado para 4 min e 45 seg
quando o timer termina voce chama o metodo que ira salvar os dados do usuario no banco do jeito que nencessita
eu tenho essa ideia so naum sei se é viavel ou ha outra forma melhor
Aproposito posta como voce fez para redirecionar ?
Como resolveu aquele erro ?
Dentro do Filter eu joguei esse código dentro da parte de autenticação:
boolean autenticado = rq.getSession().getAttribute("user") != null;
String url = rq.getRequestURL().toString();
if(!autenticado && precisaAutenticar(url)){
rp.sendRedirect(rq.getContextPath() + "/publico/login.jsf");
Então toda vez que o cara não estiver autenticado, vai voltar pra página de login… A idéia na verdade é depois criar uma página de TimeOut que redirecione em segundos pra página de login ou com o link pra página de login novamente…
O meu problema realmente é salvar os dados do Objeto Usuário dentro de algum lugar além da sessão… Porque quando a sessão expirar, eu vou ter esses dados pra gravar no Logout… Se continuar só gravando na sessão, não consigo gravar porque a sessão é destruída…