openwebbeans-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From strub...@apache.org
Subject svn commit: r1678262 - /openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
Date Thu, 07 May 2015 21:03:03 GMT
Author: struberg
Date: Thu May  7 21:03:03 2015
New Revision: 1678262

URL: http://svn.apache.org/r1678262
Log:
OWB-1069 detect if the session is expired or got manually invalidated()

This is important as there are different rules defined in the CDI spec:
A Session needs to be
* destroyed immediately on a session timeout
* destroyed at the end of the request if a manual Session.invalidate() got invoked.


Modified:
    openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java

Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java?rev=1678262&r1=1678261&r2=1678262&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
(original)
+++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
Thu May  7 21:03:03 2015
@@ -47,6 +47,7 @@ import javax.servlet.ServletRequestEvent
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.lang.annotation.Annotation;
+import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -449,11 +450,20 @@ public class WebContextsService extends
         // Get current session context from ThreadLocal
         SessionContext context = sessionContexts.get();
         HttpSession session = null;
+
+        // whether the session is destroyed because it is expired
+        boolean sessionIsExpiring = false;
+
         if (endObject != null && endObject instanceof HttpSession)
         {
             session = (HttpSession) endObject;
             if (context == null && session.getAttribute(OWB_SESSION_CONTEXT_ATTRIBUTE_NAME)
!= null)
             {
+                if (!destroySessionImmediately)
+                {
+                    sessionIsExpiring = sessionIsExpiring(session);
+                }
+                
                 // init in this case only attaches the existing session to the ThreadLocal
                 initSessionContext(session);
                 context = sessionContexts.get();
@@ -466,8 +476,9 @@ public class WebContextsService extends
             // we need to mark the conversation to get destroyed at the end of the request
             ServletRequestContext requestContext = getRequestContext(true);
 
-            if (destroySessionImmediately || requestContext == null
-                    || requestContext.getServletRequest() == null || requestContext.getServletRequest().getSession()
== null)
+            if (destroySessionImmediately
+                    || requestContext == null || requestContext.getServletRequest() == null
|| requestContext.getServletRequest().getSession() == null
+                    || sessionIsExpiring)
             {
                 context.destroy();
                 webBeansContext.getBeanManagerImpl().fireEvent(session != null ? session
: new Object(), DestroyedLiteral.INSTANCE_SESSION_SCOPED);
@@ -484,6 +495,24 @@ public class WebContextsService extends
 
     }
 
+
+    /**
+     * @return {@code true} if the sessino is currently expiring or has already expired
+     */
+    protected boolean sessionIsExpiring(HttpSession session)
+    {
+        int maxInactiveInterval = session.getMaxInactiveInterval();
+        if (maxInactiveInterval > 0)
+        {
+            long inactiveSince = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()
- session.getLastAccessedTime());
+            if (inactiveSince >= maxInactiveInterval)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Creates the application context at the application startup 
      * @param startupObject servlet context object or other startup



Mime
View raw message