Я отправил запрос с помощью трекера общедоступных вопросов , как подсказывает Ггримальдо .
Они подтвердили, что, скорее всего, это проблема, связанная с браузером, поскольку сеансы не теряются с некоторыми браузерами и платформами. Они предложили установить cookie с идентификатором сеанса и прочитать идентификатор сеанса, если данные сеанса были нулевыми. Я нашел этот пост , описывающий, как читать данные _ah_session из хранилища данных, и реализовал его таким образом,
try {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key sessionKey = KeyFactory.createKey("_ah_SESSION", "_ahs" + sessionId);
Entity sessionEntity = datastore.get(sessionKey);
Blob blob = (Blob) sessionEntity.getProperty(_VALUES);
byte[] sessionBytes = blob.getBytes();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(sessionBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return (Map<String, Object>) objectInputStream.readObject();
} catch (EntityNotFoundException e) {
logger.log(Level.INFO, e.getMessage());
} catch (Exception e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
позвонил отсюда,
String mySessionId = null;
for (Cookie cookie : cookies) {
if ("MYSESSIONID".equals(cookie.getName())) {
mySessionId = cookie.getValue();
}
}
// returning code is above
sessionMap = gcpSessionService.getGcpSession(swgcSessionId);
if (sessionMap != null) {
access = (Access) sessionMap.get(ACCESS);
}
Я попрошу своих пользователей повторить попытку и немного посмотреть журналы. Это было особенно раздражающим вопросом, но, поскольку я поддерживаю этот сайт в качестве волонтера клуба, никаких жалоб от тех, кто хочет заняться техническим обслуживанием, нет. Я выложу обновление. Если jsessionid изменчив, мне придется прибегнуть к созданию собственного cookie-файла (argh).
Итак, вот мой код установки cookie, скопированный из другого места в stackoverflow,
protected void setMySessionCookie(HttpServletResponse response, String jSessionId) {
logger.log(Level.INFO, "setting MYSESSIONID = " + jSessionId);
final String cookieName = "MYSESSIONID";
// you could assign it some encoded value
final String cookieValue = jSessionId;
// TODO enforce SSL
final Boolean useSecureCookie = false;
final int expiryTime = -1; // 24h in seconds
final String cookiePath = "/";
Cookie cookie = new Cookie(cookieName, cookieValue);
// determines whether the cookie should only be sent using a secure protocol, such as HTTPS or SSL
cookie.setSecure(useSecureCookie);
// A negative value means that the cookie is not stored persistently and will be deleted when the Web browser exits. A zero value causes the cookie to be deleted.
cookie.setMaxAge(expiryTime);
// The cookie is visible to all the pages in the directory you specify, and all the pages in that directory's subdirectories
cookie.setPath(cookiePath);
response.addCookie(cookie);
}
Я устанавливаю это при первом установлении сеанса и обновляю его каждый раз, когда сеанс сохраняется. Существует некоторая дополнительная условная логика для установки или обновления значения сеанса в файле cookie при каждом сохранении атрибута сеанса в сеансе. Это работает, и мои пользователи счастливы.
Нет очевидной причины, почему это произошло в первую очередь, так что, надеюсь, никто не столкнется с этим. Если хотите, проголосуйте или оставьте комментарий, чтобы я понял, если это только я, спасибо!