diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java index 20ba3af39e5b8bdb4c76edb98ec721b2d3f177ce..3f6c1e08e6c600d8754d20e9742714ad3dc0234a 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java @@ -101,19 +101,22 @@ public class OpenBISAuthenticationInterceptor implements MethodInterceptor } - /** - * authenticate when the session has expired. - */ @Override - public synchronized Object invoke(MethodInvocation invocation) throws Throwable + public Object invoke(MethodInvocation invocation) throws Throwable { - checkSessionToken(); + String sessionToken = getSessionToken(); try { return invocation.proceed(); } catch (InvalidSessionException ise) { - authenticate(); + synchronized (this) + { + if (sessionToken == sessionHolder.getSessionToken()) + { + authenticate(); + } + } return invocation.proceed(); } } @@ -151,12 +154,21 @@ public class OpenBISAuthenticationInterceptor implements MethodInterceptor service.registerDataStoreServer(sessionToken, dataStoreServerInfo); } - private final void checkSessionToken() + /** + * authenticates when the session has expired. + */ + private final String getSessionToken() { if (sessionHolder.getSessionToken() == null) { - authenticate(); + synchronized (this) + { + if (sessionHolder.getSessionToken() == null) + authenticate(); + } } + + return sessionHolder.getSessionToken(); } public final void setPort(int port) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java index 1697e4afdcb116f936edf31f5bab4c81e59cba5d..d858357f611a61c2a562d658e975939d9694a8df 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java @@ -30,7 +30,7 @@ public class OpenBISSessionHolder implements Serializable, ISessionTokenProvider { private static final long serialVersionUID = 1L; - private String sessionToken; + private volatile String sessionToken; private String dataStoreCode;