You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2014/08/22 17:25:56 UTC

git commit: WW-3895 Uses session id for synchronisation

Repository: struts
Updated Branches:
  refs/heads/develop c6b7aaf81 -> eecd90763


WW-3895 Uses session id for synchronisation


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/eecd9076
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/eecd9076
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/eecd9076

Branch: refs/heads/develop
Commit: eecd907638d223a74b91a944476c11750adac4ab
Parents: c6b7aaf
Author: Lukasz Lenart <lu...@apache.org>
Authored: Fri Aug 22 17:25:45 2014 +0200
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Fri Aug 22 17:25:45 2014 +0200

----------------------------------------------------------------------
 .../apache/struts2/dispatcher/SessionMap.java    | 19 ++++++++++++-------
 .../TokenSessionStoreInterceptor.java            |  2 +-
 .../struts2/dispatcher/SessionMapTest.java       |  1 +
 .../struts2/views/jsp/StrutsMockHttpSession.java |  7 +++++++
 4 files changed, 21 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/eecd9076/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java b/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
index d22127d..8da98da 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/SessionMap.java
@@ -21,6 +21,8 @@
 
 package org.apache.struts2.dispatcher;
 
+import org.apache.struts2.components.Submit;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.io.Serializable;
@@ -68,7 +70,7 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
             return;
         }
 
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             session.invalidate();
             session = null;
             entries = null;
@@ -79,12 +81,13 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
      * Removes all attributes from the session as well as clears entries in this
      * map.
      */
+    @SuppressWarnings("unchecked")
     public void clear() {
         if (session == null) {
             return;
         }
 
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             entries = null;
             Enumeration<String> attributeNamesEnum = session.getAttributeNames();
             while (attributeNamesEnum.hasMoreElements()) {
@@ -99,12 +102,13 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
      *
      * @return a Set of attributes from the http session.
      */
+    @SuppressWarnings("unchecked")
     public Set<java.util.Map.Entry<K, V>> entrySet() {
         if (session == null) {
             return Collections.emptySet();
         }
 
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             if (entries == null) {
                 entries = new HashSet<Map.Entry<K, V>>();
 
@@ -154,12 +158,13 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
      * @param key the name of the session attribute.
      * @return the session attribute or <tt>null</tt> if it doesn't exist.
      */
+    @SuppressWarnings("unchecked")
     public V get(Object key) {
         if (session == null) {
             return null;
         }
 
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             return (V) session.getAttribute(key.toString());
         }
     }
@@ -177,7 +182,7 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
                 session = request.getSession(true);
             }
         }
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             V oldValue = get(key);
             entries = null;
             session.setAttribute(key.toString(), value);
@@ -196,7 +201,7 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
             return null;
         }
 
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             entries = null;
 
             V value = get(key);
@@ -218,7 +223,7 @@ public class SessionMap<K, V> extends AbstractMap<K, V> implements Serializable
             return false;
         }
 
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             return (session.getAttribute(key.toString()) != null);
         }
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/eecd9076/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
index 66e6dfd..871f24d 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
@@ -109,7 +109,7 @@ public class TokenSessionStoreInterceptor extends TokenInterceptor {
         //see WW-2902: we need to use the real HttpSession here, as opposed to the map
         //that wraps the session, because a new wrap is created on every request
         HttpSession session = ServletActionContext.getRequest().getSession(true);
-        synchronized (session) {
+        synchronized (session.getId().intern()) {
             if (!TokenHelper.validToken()) {
                 return handleInvalidToken(invocation);
             }

http://git-wip-us.apache.org/repos/asf/struts/blob/eecd9076/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java b/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
index e71f70d..823bfb0 100644
--- a/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
+++ b/core/src/test/java/org/apache/struts2/dispatcher/SessionMapTest.java
@@ -207,6 +207,7 @@ public class SessionMapTest extends TestCase {
 
     protected void setUp() throws Exception {
         sessionMock = new Mock(HttpSession.class);
+        sessionMock.matchAndReturn("getId", "1");
         requestMock = new Mock(HttpServletRequest.class);
         requestMock.matchAndReturn("getSession", new Constraint[]{new IsEqual(Boolean.FALSE)}, sessionMock.proxy());
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/eecd9076/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpSession.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpSession.java b/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpSession.java
index 4de2e52..f8be6b9 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpSession.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/StrutsMockHttpSession.java
@@ -23,6 +23,7 @@ package org.apache.struts2.views.jsp;
 
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.UUID;
 
 import com.mockobjects.servlet.MockHttpSession;
 
@@ -67,4 +68,10 @@ public class StrutsMockHttpSession extends MockHttpSession {
     public void setupGetAttributeNames(Enumeration enumeration) {
         throw new UnsupportedOperationException();
     }
+
+    @Override
+    public String getId() {
+        return UUID.randomUUID().toString();
+    }
+
 }