Мои объекты сеанса хранятся только в области запроса в движке Google, и я не могу понять, как перенести объекты между запросами. Документы рядом с бесполезными по этому вопросу, и я не могу найти никого, у кого возникла аналогичная проблема. Пожалуйста помоги.Сессии, не сохраняющиеся между запросами
Когда я хранить объекты сеанса в сервлет и направить запрос в JSP с помощью:
getServletContext().getRequestDispatcher("/example.jsp").forward(request,response);
Все работает как надо. Но когда я храню объекты на сеансе и перенаправляю запрос, используя:
response.sendRedirect("/example/url");
Объекты сеанса теряются в эфире. Фактически, когда я дамлю пары ключей/значений сеанса для новых запросов, абсолютно ничего нет, объекты сеанса появляются только в области запросов сервлетов, которые создают объекты сеанса. Мне кажется, что объекты не записываются в Memcache или Datastore. Стоит отметить, что все работает отлично на моем сервере разработки, но когда я загружаюсь в App Engine, он ломается. Это заставляет меня думать, что это проблема с конфигурацией.
С точки зрения настройке сессий для моего приложения я поставил
<sessions-enabled>true</sessions-enabled>
В Appengine-web.xml. Есть ли что-то еще, что мне не хватает?
Документация по сессиям также отмечает, что в сеансе между запросами могут храниться объекты, реализующие Serializable. Я привел пример кода, который не работает ниже.
Очевидное решение состоит в том, чтобы не использовать перенаправления, и это может быть хорошо для приведенного ниже примера, но некоторые данные приложения необходимо хранить в сеансе между запросами, поэтому мне нужно найти решение этой проблемы.
ПРИМЕР: Класс FlashMessage дает обратную связь пользователю с серверных операций.
if (email.send()) {
FlashMessage flash = new FlashMessage(FlashMessage.SUCCESS, "Your message has been sent.");
session.setAttribute(FlashMessage.SESSION_KEY, flash);
// The flash message will not be available in the session object in the next request
response.sendRedirect(URL.HOME);
} else {
FlashMessage flash = new FlashMessage(FlashMessage.ERROR, FlashMessage.INVALID_FORM_DATA);
session.setAttribute(FlashMessage.SESSION_KEY, flash);
// The flash message is displayed without problem
getServletContext().getRequestDispatcher(Templates.CONTACT_FORM).forward(request,response);
}
FlashMessage.java
import java.io.Serializable;
public class FlashMessage implements Serializable {
private static final long serialVersionUID = 8109520737272565760L; // I have tried using different, default and no serialVersionUID
public static final String SESSION_KEY = "flashMessage";
public static final String ERROR = "error";
public static final String SUCCESS = "success";
public static final String INVALID_FORM_DATA = "Your request failed to validate.";
private String message;
private String type;
public FlashMessage (String type, String message) {
this.type = type;
this.message = message;
}
public String display(){
return "<div id='flash' class='" + type + "'>" + message + "</div>";
}
}
Вы можете видеть объекты сеанса в хранилище данных, используя браузер хранилища данных? Apperntly с префиксом _ah_SESSION –
Возможно, необходимо улучшить класс Flash? –
Просто нашел браузер хранилища данных, не знал об этом – klonq