Bläddra i källkod

fix: set Vaadin session attribute using lock in reinitializeSession (#12409)

* fix: set Vaadin session attribute using lock in reinitializeSession

* Add unit test

* Revert

* Add unit test

Backport to Java 6

* Add imports

* More Java 6
tags/7.7.28
Tatu Lund 2 år sedan
förälder
incheckning
0f7e062338
Inget konto är kopplat till bidragsgivarens mejladress

+ 14
- 4
server/src/main/java/com/vaadin/server/VaadinService.java Visa fil

@@ -1078,8 +1078,13 @@ public abstract class VaadinService implements Serializable {
if (value instanceof VaadinSession) {
// set flag to avoid cleanup
VaadinSession serviceSession = (VaadinSession) value;
serviceSession.setAttribute(PRESERVE_UNBOUND_SESSION_ATTRIBUTE,
Boolean.TRUE);
serviceSession.lock();
try {
serviceSession.setAttribute(
PRESERVE_UNBOUND_SESSION_ATTRIBUTE, Boolean.TRUE);
} finally {
serviceSession.unlock();
}
}
attrs.put(name, value);
}
@@ -1105,8 +1110,13 @@ public abstract class VaadinService implements Serializable {
serviceSession.getLockInstance());

service.storeSession(serviceSession, newSession);
serviceSession.setAttribute(PRESERVE_UNBOUND_SESSION_ATTRIBUTE,
null);
serviceSession.lock();
try {
serviceSession.setAttribute(
PRESERVE_UNBOUND_SESSION_ATTRIBUTE, null);
} finally {
serviceSession.unlock();
}
}
}


+ 49
- 0
server/src/test/java/com/vaadin/server/VaadinServiceTest.java Visa fil

@@ -7,9 +7,15 @@ import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSessionBindingEvent;

import java.util.Collections;

import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;


/**
*
@@ -125,4 +131,47 @@ public class VaadinServiceTest {

assertThat(notification, containsString("\"url\":null"));
}
@Test
public void reinitializeSession_setVaadinSessionAttriuteWithLock() {
final VaadinRequest request = Mockito.mock(VaadinRequest.class);

VaadinSession vaadinSession = Mockito.mock(VaadinSession.class);
final VaadinSession newVaadinSession = Mockito.mock(VaadinSession.class);

WrappedSession session = mockSession(request, vaadinSession, "foo");

Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) {
mockSession(request, newVaadinSession, "bar");
return null;
}
}).when(session).invalidate();

VaadinService.reinitializeSession(request);

Mockito.verify(vaadinSession, Mockito.times(2)).lock();
Mockito.verify(vaadinSession).setAttribute(
VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE, Boolean.TRUE);
Mockito.verify(vaadinSession).setAttribute(
VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE, null);
Mockito.verify(vaadinSession, Mockito.times(2)).unlock();
}

private WrappedSession mockSession(VaadinRequest request,
VaadinSession vaadinSession, String attributeName) {
WrappedSession session = Mockito.mock(WrappedSession.class);
Mockito.when(request.getWrappedSession()).thenReturn(session);

Mockito.when(session.getAttributeNames())
.thenReturn(Collections.singleton(attributeName));

Mockito.when(session.getAttribute(attributeName))
.thenReturn(vaadinSession);

VaadinService service = Mockito.mock(VaadinService.class);

Mockito.when(vaadinSession.getService()).thenReturn(service);
return session;
}
}

Laddar…
Avbryt
Spara