@@ -39,8 +39,8 @@ public class SessionMap extends AbstractMap<String, Object> implements Serializa
3939 @ Serial
4040 private static final long serialVersionUID = 4678843241638046854L ;
4141
42- protected HttpSession session ;
43- protected Set <Entry <String , Object >> entries ;
42+ protected volatile HttpSession session ;
43+ protected volatile Set <Entry <String , Object >> entries ;
4444 protected HttpServletRequest request ;
4545
4646
@@ -62,11 +62,10 @@ public SessionMap(final HttpServletRequest request) {
6262 * Invalidate the http session.
6363 */
6464 public void invalidate () {
65- if (session == null ) {
66- return ;
67- }
68-
69- synchronized (session .getId ().intern ()) {
65+ synchronized (this ) {
66+ if (session == null ) {
67+ return ;
68+ }
7069 session .invalidate ();
7170 session = null ;
7271 entries = null ;
@@ -79,18 +78,16 @@ public void invalidate() {
7978 */
8079 @ Override
8180 public void clear () {
82- if (session == null ) {
83- return ;
84- }
85-
86- synchronized (session .getId ().intern ()) {
81+ synchronized (this ) {
82+ if (session == null ) {
83+ return ;
84+ }
8785 entries = null ;
8886 final Enumeration <String > attributeNamesEnum = session .getAttributeNames ();
8987 while (attributeNamesEnum .hasMoreElements ()) {
9088 session .removeAttribute (attributeNamesEnum .nextElement ());
9189 }
9290 }
93-
9491 }
9592
9693 /**
@@ -100,11 +97,10 @@ public void clear() {
10097 */
10198 @ Override
10299 public Set <Entry <String , Object >> entrySet () {
103- if (session == null ) {
104- return Collections .emptySet ();
105- }
106-
107- synchronized (session .getId ().intern ()) {
100+ synchronized (this ) {
101+ if (session == null ) {
102+ return Collections .emptySet ();
103+ }
108104 if (entries == null ) {
109105 entries = new HashSet <>();
110106
@@ -123,27 +119,25 @@ public Object setValue(final Object obj) {
123119 });
124120 }
125121 }
122+ return entries ;
126123 }
127-
128- return entries ;
129124 }
130125
131126 /**
132127 * Returns the session attribute associated with the given key or <tt>null</tt> if it doesn't exist.
133128 *
134129 * <b>Note:</b> Must use the same signature as {@link java.util.AbstractMap#get(java.lang.Object)} to ensure the
135- * expected specialized behaviour is performed here (and not the generic ancestor behaviour).
130+ * expected specialized behaviour is performed here (and not the generic ancestor behaviour).
136131 *
137132 * @param key the name of the session attribute.
138133 * @return the session attribute or <tt>null</tt> if it doesn't exist.
139134 */
140135 @ Override
141136 public Object get (final Object key ) {
142- if (session == null ) {
143- return null ;
144- }
145-
146- synchronized (session .getId ().intern ()) {
137+ synchronized (this ) {
138+ if (session == null ) {
139+ return null ;
140+ }
147141 return session .getAttribute (key != null ? key .toString () : null );
148142 }
149143 }
@@ -161,8 +155,6 @@ public Object put(final String key, final Object value) {
161155 if (session == null ) {
162156 session = request .getSession (true );
163157 }
164- }
165- synchronized (session .getId ().intern ()) {
166158 final Object oldValue = get (key );
167159 entries = null ;
168160 session .setAttribute (key , value );
@@ -174,22 +166,21 @@ public Object put(final String key, final Object value) {
174166 * Removes the specified session attribute.
175167 *
176168 * <b>Note:</b> Must use the same signature as {@link java.util.AbstractMap#remove(java.lang.Object)} to ensure the
177- * expected specialized behaviour is performed here (and not the generic ancestor behaviour).
169+ * expected specialized behaviour is performed here (and not the generic ancestor behaviour).
178170 *
179171 * @param key the name of the attribute to remove.
180172 * @return the value that was removed or <tt>null</tt> if the value was not found (and hence, not removed).
181173 */
182174 @ Override
183175 public Object remove (final Object key ) {
184- if (session == null ) {
185- return null ;
186- }
187-
188- synchronized (session .getId ().intern ()) {
176+ synchronized (this ) {
177+ if (session == null ) {
178+ return null ;
179+ }
189180 entries = null ;
190181
191182 final String keyAsString = (key != null ? key .toString () : null );
192- final Object value = get (keyAsString );
183+ final Object value = session . getAttribute (keyAsString );
193184 session .removeAttribute (keyAsString );
194185
195186 return value ;
@@ -201,18 +192,17 @@ public Object remove(final Object key) {
201192 * Checks if the specified session attribute with the given key exists.
202193 *
203194 * <b>Note:</b> Must use the same signature as {@link java.util.AbstractMap#containsKey(java.lang.Object)} to ensure the
204- * expected specialized behaviour is performed here (and not the generic ancestor behaviour).
195+ * expected specialized behaviour is performed here (and not the generic ancestor behaviour).
205196 *
206197 * @param key the name of the session attribute.
207198 * @return <tt>true</tt> if the session attribute exits or <tt>false</tt> if it doesn't exist.
208199 */
209200 @ Override
210201 public boolean containsKey (final Object key ) {
211- if (session == null ) {
212- return false ;
213- }
214-
215- synchronized (session .getId ().intern ()) {
202+ synchronized (this ) {
203+ if (session == null ) {
204+ return false ;
205+ }
216206 final String keyAsString = (key != null ? key .toString () : null );
217207 return (session .getAttribute (keyAsString ) != null );
218208 }
0 commit comments