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();
+ }
+
}