diff --git a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java index 42aa35a..0c34620 100644 --- a/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java +++ b/impl/extension/jsf/src/main/java/br/gov/frameworkdemoiselle/internal/context/FacesViewContextImpl.java @@ -39,6 +39,7 @@ package br.gov.frameworkdemoiselle.internal.context; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; +import javax.enterprise.event.Observes; import javax.enterprise.inject.Alternative; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; @@ -48,6 +49,7 @@ import javax.servlet.http.HttpSession; import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.annotation.ViewScoped; import br.gov.frameworkdemoiselle.context.ViewContext; +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; import br.gov.frameworkdemoiselle.util.Faces; /** @@ -80,8 +82,6 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC @Override protected BeanStore getStore() { - clearInvalidatedSession(); - final String sessionId = getSessionId(); if (sessionId==null){ @@ -113,13 +113,13 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC return currentStore.getStore(viewId, this); } - private synchronized void clearInvalidatedSession(){ - if (wasSessionInvalidated()){ - final String requestedSessionId = getRequestedSessionId(); - final SessionBeanStore store = sessionBeanStore.get(requestedSessionId); + protected void clearInvalidatedSession(@Observes BeforeSessionDestroyed event){ + String sessionId = event.getSessionId(); + if (sessionId != null){ + final SessionBeanStore store = sessionBeanStore.get(sessionId); if (store!=null){ store.clear(this); - sessionBeanStore.remove(requestedSessionId); + sessionBeanStore.remove(sessionId); } } } @@ -128,14 +128,4 @@ public class FacesViewContextImpl extends AbstractCustomContext implements ViewC final HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); return session!=null ? session.getId() : null; } - - private String getRequestedSessionId(){ - final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); - return request!=null ? request.getRequestedSessionId() : null; - } - - private boolean wasSessionInvalidated(){ - final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); - return request!=null && request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); - } } diff --git a/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java new file mode 100644 index 0000000..884700f --- /dev/null +++ b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/AfterSessionCreated.java @@ -0,0 +1,13 @@ +package br.gov.frameworkdemoiselle.lifecycle; + +/** + * This interface represents an event fired before a new HTTP session is created. + * + * @author serpro + * + */ +public interface AfterSessionCreated { + + public String getSessionId(); + +} diff --git a/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java new file mode 100644 index 0000000..487fa74 --- /dev/null +++ b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/lifecycle/BeforeSessionDestroyed.java @@ -0,0 +1,13 @@ +package br.gov.frameworkdemoiselle.lifecycle; + +/** + * This interface represents an event fired after a new HTTP session is destroyed. + * + * @author serpro + * + */ +public interface BeforeSessionDestroyed { + + public String getSessionId(); + +} diff --git a/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java new file mode 100644 index 0000000..0a2b452 --- /dev/null +++ b/impl/extension/servlet/src/main/java/br/gov/frameworkdemoiselle/util/SessionListener.java @@ -0,0 +1,44 @@ +package br.gov.frameworkdemoiselle.util; + +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +import br.gov.frameworkdemoiselle.lifecycle.BeforeSessionDestroyed; +import br.gov.frameworkdemoiselle.lifecycle.AfterSessionCreated; + +/** + *
Implements the {@link HttpSessionListener} interface and fires two events.
+ * + *