Мои объекты сеанса хранятся только в области запросов на движке приложений 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>";
}
}