Browse Source

Don't close an unbound VaadinSession for GAEVaadinServlet (#12209)

Change-Id: If3480eb6e21f5f19a43b8dc0d6279173ff3bec40
tags/7.1.1
Leif Åstrand 11 years ago
parent
commit
654d5707a9

+ 11
- 0
server/src/com/vaadin/server/GAEVaadinServlet.java View File

@@ -401,7 +401,18 @@ public class GAEVaadinServlet extends VaadinServlet {
if (serviceSession == null) {
return;
}

/*
* Inform VaadinSession.valueUnbound that it should not kill the session
* even though it gets unbound.
*/
serviceSession.setAttribute(
VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE, Boolean.TRUE);
serviceSession.removeFromSession(getService());

// Remove preservation marker
serviceSession.setAttribute(
VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE, null);
}

/**

+ 20
- 4
server/src/com/vaadin/server/VaadinService.java View File

@@ -71,9 +71,25 @@ import com.vaadin.util.ReflectTools;
* @since 7.0
*/
public abstract class VaadinService implements Serializable {
static final String REINITIALIZING_SESSION_MARKER = VaadinService.class
/**
* Attribute name for telling
* {@link VaadinSession#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)}
* that it should not close a {@link VaadinSession} even though it gets
* unbound. If a {@code VaadinSession} has an attribute with this name and
* the attribute value is {@link Boolean#TRUE}, that session will not be
* closed when it is unbound from the underlying session.
*/
// Use the old name.reinitializing value for backwards compatibility
static final String PRESERVE_UNBOUND_SESSION_ATTRIBUTE = VaadinService.class
.getName() + ".reinitializing";

/**
* @deprecated As of 7.1.1, use {@link #PRESERVE_UNBOUND_SESSION_ATTRIBUTE}
* instead
*/
@Deprecated
static final String REINITIALIZING_SESSION_MARKER = PRESERVE_UNBOUND_SESSION_ATTRIBUTE;

private static final Method SESSION_INIT_METHOD = ReflectTools.findMethod(
SessionInitListener.class, "sessionInit", SessionInitEvent.class);

@@ -970,7 +986,7 @@ public abstract class VaadinService implements Serializable {
if (value instanceof VaadinSession) {
// set flag to avoid cleanup
VaadinSession serviceSession = (VaadinSession) value;
serviceSession.setAttribute(REINITIALIZING_SESSION_MARKER,
serviceSession.setAttribute(PRESERVE_UNBOUND_SESSION_ATTRIBUTE,
Boolean.TRUE);
}
attrs.put(name, value);
@@ -997,8 +1013,8 @@ public abstract class VaadinService implements Serializable {
serviceSession.getLockInstance());

serviceSession.storeInSession(service, newSession);
serviceSession
.setAttribute(REINITIALIZING_SESSION_MARKER, null);
serviceSession.setAttribute(PRESERVE_UNBOUND_SESSION_ATTRIBUTE,
null);
}
}


+ 5
- 3
server/src/com/vaadin/server/VaadinSession.java View File

@@ -240,9 +240,11 @@ public class VaadinSession implements HttpSessionBindingListener, Serializable {
} else if (VaadinService.getCurrentRequest() != null
&& getCurrent() == this) {
assert hasLock();
// Ignore if the session is being moved to a different backing
// session
if (getAttribute(VaadinService.REINITIALIZING_SESSION_MARKER) == Boolean.TRUE) {
/*
* Ignore if the session is being moved to a different backing
* session or if GAEVaadinServlet is doing its normal cleanup.
*/
if (getAttribute(VaadinService.PRESERVE_UNBOUND_SESSION_ATTRIBUTE) == Boolean.TRUE) {
return;
}


Loading…
Cancel
Save