diff --git a/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java b/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java index 6f8331f05f..ce1546aa6e 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,8 @@ package org.springframework.web.context.request; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -50,7 +50,7 @@ public class ServletRequestAttributes extends AbstractRequestAttributes { private volatile HttpSession session; - private final Map sessionAttributesToUpdate = new HashMap(); + private final Map sessionAttributesToUpdate = new ConcurrentHashMap(1); /** @@ -103,9 +103,7 @@ public class ServletRequestAttributes extends AbstractRequestAttributes { try { Object value = session.getAttribute(name); if (value != null) { - synchronized (this.sessionAttributesToUpdate) { - this.sessionAttributesToUpdate.put(name, value); - } + this.sessionAttributesToUpdate.put(name, value); } return value; } @@ -127,9 +125,7 @@ public class ServletRequestAttributes extends AbstractRequestAttributes { } else { HttpSession session = getSession(true); - synchronized (this.sessionAttributesToUpdate) { - this.sessionAttributesToUpdate.remove(name); - } + this.sessionAttributesToUpdate.remove(name); session.setAttribute(name, value); } } @@ -144,9 +140,7 @@ public class ServletRequestAttributes extends AbstractRequestAttributes { else { HttpSession session = getSession(false); if (session != null) { - synchronized (this.sessionAttributesToUpdate) { - this.sessionAttributesToUpdate.remove(name); - } + this.sessionAttributesToUpdate.remove(name); try { session.removeAttribute(name); // Remove any registered destruction callback as well. @@ -220,24 +214,22 @@ public class ServletRequestAttributes extends AbstractRequestAttributes { // Store session reference for access after request completion. this.session = this.request.getSession(false); // Update all affected session attributes. - synchronized (this.sessionAttributesToUpdate) { - if (this.session != null) { - try { - for (Map.Entry entry : this.sessionAttributesToUpdate.entrySet()) { - String name = entry.getKey(); - Object newValue = entry.getValue(); - Object oldValue = this.session.getAttribute(name); - if (oldValue == newValue) { - this.session.setAttribute(name, newValue); - } + if (this.session != null) { + try { + for (Map.Entry entry : this.sessionAttributesToUpdate.entrySet()) { + String name = entry.getKey(); + Object newValue = entry.getValue(); + Object oldValue = this.session.getAttribute(name); + if (oldValue == newValue) { + this.session.setAttribute(name, newValue); } } - catch (IllegalStateException ex) { - // Session invalidated - shouldn't usually happen. - } } - this.sessionAttributesToUpdate.clear(); + catch (IllegalStateException ex) { + // Session invalidated - shouldn't usually happen. + } } + this.sessionAttributesToUpdate.clear(); } /** diff --git a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/context/PortletRequestAttributes.java b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/context/PortletRequestAttributes.java index 6a7e1c83db..c17afecc00 100644 --- a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/context/PortletRequestAttributes.java +++ b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/context/PortletRequestAttributes.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,8 @@ package org.springframework.web.portlet.context; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; @@ -59,9 +59,9 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { private volatile PortletSession session; - private final Map sessionAttributesToUpdate = new HashMap(); + private final Map sessionAttributesToUpdate = new ConcurrentHashMap(1); - private final Map globalSessionAttributesToUpdate = new HashMap(); + private final Map globalSessionAttributesToUpdate = new ConcurrentHashMap(1); /** @@ -114,18 +114,14 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { if (scope == SCOPE_GLOBAL_SESSION) { Object value = session.getAttribute(name, PortletSession.APPLICATION_SCOPE); if (value != null) { - synchronized (this.globalSessionAttributesToUpdate) { - this.globalSessionAttributesToUpdate.put(name, value); - } + this.globalSessionAttributesToUpdate.put(name, value); } return value; } else { Object value = session.getAttribute(name); if (value != null) { - synchronized (this.sessionAttributesToUpdate) { - this.sessionAttributesToUpdate.put(name, value); - } + this.sessionAttributesToUpdate.put(name, value); } return value; } @@ -148,15 +144,11 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { PortletSession session = getSession(true); if (scope == SCOPE_GLOBAL_SESSION) { session.setAttribute(name, value, PortletSession.APPLICATION_SCOPE); - synchronized (this.globalSessionAttributesToUpdate) { - this.globalSessionAttributesToUpdate.remove(name); - } + this.globalSessionAttributesToUpdate.remove(name); } else { session.setAttribute(name, value); - synchronized (this.sessionAttributesToUpdate) { - this.sessionAttributesToUpdate.remove(name); - } + this.sessionAttributesToUpdate.remove(name); } } } @@ -173,15 +165,11 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { if (session != null) { if (scope == SCOPE_GLOBAL_SESSION) { session.removeAttribute(name, PortletSession.APPLICATION_SCOPE); - synchronized (this.globalSessionAttributesToUpdate) { - this.globalSessionAttributesToUpdate.remove(name); - } + this.globalSessionAttributesToUpdate.remove(name); } else { session.removeAttribute(name); - synchronized (this.sessionAttributesToUpdate) { - this.sessionAttributesToUpdate.remove(name); - } + this.sessionAttributesToUpdate.remove(name); } } } @@ -248,8 +236,8 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { @Override protected void updateAccessedSessionAttributes() { this.session = this.request.getPortletSession(false); - synchronized (this.sessionAttributesToUpdate) { - if (this.session != null) { + if (this.session != null) { + try { for (Map.Entry entry : this.sessionAttributesToUpdate.entrySet()) { String name = entry.getKey(); Object newValue = entry.getValue(); @@ -258,11 +246,6 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { this.session.setAttribute(name, newValue); } } - } - this.sessionAttributesToUpdate.clear(); - } - synchronized (this.globalSessionAttributesToUpdate) { - if (this.session != null) { for (Map.Entry entry : this.globalSessionAttributesToUpdate.entrySet()) { String name = entry.getKey(); Object newValue = entry.getValue(); @@ -272,8 +255,12 @@ public class PortletRequestAttributes extends AbstractRequestAttributes { } } } - this.globalSessionAttributesToUpdate.clear(); + catch (IllegalStateException ex) { + // Session invalidated - shouldn't usually happen. + } } + this.sessionAttributesToUpdate.clear(); + this.globalSessionAttributesToUpdate.clear(); } /**