2010-06-09 3 views
1

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

Вы можете видеть объекты сеанса в хранилище данных, используя браузер хранилища данных? Apperntly с префиксом _ah_SESSION –

+0

Возможно, необходимо улучшить класс Flash? –

+0

Просто нашел браузер хранилища данных, не знал об этом – klonq

ответ

2

Я отключил уровень журнала для отладки и обнаружил, что AppEngine выбрасывает исключения в методах уничтожения одного из своих фильтров. Именно поэтому объекты не сохранялись в сеансе.

Я разрешил исключения, и все работает нормально.

Надеюсь, что это поможет кому-то по линии.

+0

Старый движок приложения до его трюков. –

1

Возможно, вам необходимо добавить конструктор по умолчанию без аргументов.

+0

Я дал ему шанс, без славы. – klonq

+0

hmmm ... просто гадать –

Смежные вопросы