Nesse post vou mostrar como fazer o redirecionamento para alguma página quando a sessão expirar em aplicações que utilizam ADF Faces.
Nós vamos usar um PagePhaseListener.
Segue o código abaixo do PagePhaseListener:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package br.com.brunorota; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import oracle.adf.controller.v2.lifecycle.Lifecycle; import oracle.adf.controller.v2.lifecycle.PagePhaseEvent; import oracle.adf.controller.v2.lifecycle.PagePhaseListener; import org.apache.myfaces.trinidad.render.ExtendedRenderKitService; import org.apache.myfaces.trinidad.util.Service; /** * PhaseListener para redirecionar para a home quando a sessão expirar */ public class TimeOutListener implements PagePhaseListener { private static final String PAGINA = "http://localhost:7001/MinhaApp/faces/home.jspx"; public TimeOutListener() { super(); } /** * Realiza a lógica do redirect * @param pagePhaseEvent */ public void afterPhase(PagePhaseEvent pagePhaseEvent) { if (pagePhaseEvent.getPhaseId() == Lifecycle.PREPARE_RENDER_ID) { FacesContext facesCtx = FacesContext.getCurrentInstance(); ExternalContext extCtx = facesCtx.getExternalContext(); HttpSession session = (HttpSession)extCtx.getSession(false); if (session != null) { int secsTimeout = session.getMaxInactiveInterval(); if (secsTimeout > 0) { HttpServletRequest req = (HttpServletRequest)extCtx.getRequest(); String appURL = PAGINA; // incrementa alguns segundos para garantir que a sessão expirou no server secsTimeout += 2; String jsCall = "document.acmeStartClientSessionTimers = function()n" + "{n" + " if(document.acmeSessionTimeoutTimer != null)n" + " window.clearTimeout(document.acmeSessionTimeoutTimer);n" + "n" + " document.acmeSessionTimeoutTimer = window.setTimeout("document.acmeClientSessionTimeout();", " + secsTimeout * 1000 + ");n" + "n" + "}n" + "document.acmeStartClientSessionTimers();n" + "n" + "document.acmeClientSessionTimeout = function()n" + "{n" + " window.location.href = '" + appURL + "' n" + "}"; ExtendedRenderKitService rks = Service.getRenderKitService(facesCtx, ExtendedRenderKitService.class); rks.addScript(facesCtx, jsCall); } } } } public void beforePhase(PagePhaseEvent pagePhaseEvent) { } } |
Para fazer a sua aplicação ouvir o PagePhaseListener, você deve criar um arquivo adf-settings.xml dentro do diretório src/META-INF/ da sua aplicação.
Segue abaixo a configuração para o PagePhaseListener:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="windows-1252" ?> <adf-settings xmlns="http://xmlns.oracle.com/adf/settings"> <adfc-controller-config xmlns="http://xmlns.oracle.com/adf/controller/config"> <lifecycle> <phase-listener> <listener-id>TimeOutListener</listener-id> <class>br.com.brunorota.TimeOutListener</class> </phase-listener> </lifecycle> </adfc-controller-config> </adf-settings> |
É isso galera.
Até o próximo post.