Сессии не сохраняются между запросами - PullRequest
1 голос
/ 09 июня 2010

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

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

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

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

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

1 голос
/ 09 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...