Как поделиться состоянием сеанса между сервлетами? - PullRequest
0 голосов
/ 03 марта 2011

У меня есть веб-приложение, которое содержит два сервлета: один для рендеринга моих страниц JSP, а другой для создания PDF-файлов.Я использую состояние сеанса между страницами JSP и хочу передать объект сеанса в сервлет PDF.

Вот пример того, как я устанавливаю значения сеанса в JSP:

MyObject o  = (MyObject)session.getAttribute("my.object");
if (o == null)
{
    o = new MyObject();
    session.setAttribute("my.object", o);
}

Iзатем отправьте сообщение в мой новый сервлет для генерации PDF по ссылке в моем JSP

<a href="../pdfgen?f=d&t=c" target="_blank">Generate a draft report for review</a>

. Я подумал, что мог бы использовать объект HTTPRequest для возврата сеанса в моем сервлете следующим образом:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    HttpSession session = request.getSession(false);
    MyObject o = (MyObject) session.getAttribute("my.object");
}

Используя приведенный выше код, я получаю нулевой объект сеанса из запроса.

Если я использую request.getSession(true), я получаю объект сеанса, но, конечно, он ничего не содержит в атрибуте my.object.

Как это должно работать?Каковы правила совместного использования состояния сеанса между сервлетами.

Tomcat 6

TIA

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Можете ли вы проверить, если вы случайно объявили это: <% @ page session = "false"%>?

Если вы используете неявный объект сеанса JSP для установки значения, он должен быть доступен сервлету.

Ваш код выглядит верным, хотя ..

0 голосов
/ 03 марта 2011

Не устанавливайте это в JSP.Тогда может быть уже слишком поздно, поскольку JSP является частью ответа HTTP и уже может зафиксировать ответ.Всякий раз, когда необходимо создать новый сеанс, контейнеру сервлета необходимо добавить cookie сеанса в заголовок ответа HTTP.Но это не произойдет, когда ответ уже совершен.В зависимости от servletcontainer, вы должны были видеть IllegalStateException в журналах сервера при попытке сделать это.

Вместо этого установите его в сервлете, прежде чем отправлять запрос в JSP (тот, о котором вы сказаличто он «рендерит» JSP).


Не имеет отношения к конкретной проблеме, не используйте request.getSession(false) в тех случаях, когда вам нужен сеанс, просто используйте request.getSession().Эти потенциальные NPE и нуль-проверки неуклюжи.Также написание сырого Java-кода в JSP (с использованием скриптлетов ) считается плохой практикой .

...