2010-06-15 6 views
2

Я только начал изучать Java Servlets и JSP и немного смущен о объекте session. Внутри сервлета я это:JSP :: Confused с объектами сеанса

public class SampleServlet extends HttpServlet { 

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws IOException { 

     HttpSession session = request.getSession(true); 
     session.setAttribute("_session", "_value"); 
       response.sendRedirect("page2.jsp");   
     } 
} 

Теперь внутри Page2.jsp есть объект сеанса, как хорошо, но когда я делаю это

<% 
out.print(session.getAttribute("_session")) 
%> 

не кажется, чтобы получить значение (как будто он не установлен). Я попытался установить логический атрибут в true, но на странице jsp он возвращает false. Может ли кто-нибудь сказать мне правильный способ сделать это? Что касается того, что я пытаюсь сделать, я хочу поделиться некоторыми переменными сеанса.

+0

Вы уверены, что ваш браузер настроен на поддержку куки? Перенаправление возвращается к клиенту, а затем обратно на сервер. Возможно, файл cookie потерян. –

+0

Вам необходимо включить cookies - вы уверены, что делаете это? – OpenSource

+0

@Eyal и @OpenSource: Да. Мой браузер поддерживает файлы cookie. Я пробую несколько предложений, приведенных ниже. Вернется. – Legend

ответ

3

Используйте request.getRequestDispatcher(). Forward() вместо response.sendRedirect();

Так что ваш код будет:

HttpSession session = request.getSession(true); 
session.setAttribute("_session", "_value"); 
request.getRequestDispatcher("page2.jsp").forward();  

В основном, response.sendRedirect() не сохраняет данные сеанса, так что это не было, когда СПЯ получает его. request.forward() сохраняет сеанс.

См http://www.coderanch.com/t/170618/java-Web-Component-SCWCD/certification/sendRedirect-Vs-requestdispatcher-forward

+0

Последняя строка синтаксически недействительна, и он устанавливает атрибут сеанса, поэтому он должен присутствовать в перенаправленном запросе. – BalusC

+0

К сожалению, я поставил аргумент в неправильном месте. Обновлено –

+0

Удивительный! Спасибо ... Теперь он работает ... Мне пришлось изменить этот 'forward' на' forward (request, response) 'хотя. – Legend

1

Предполагая, что ваш контейнер поддерживает его, используйте EL!

Java сторона:

HttpSession session = request.getSession(true); 
session.setAttribute("foo", "bar"); 

JSP сторона:

<html> 
    ... 
    <body> 
     ... 
     <p>${foo}</p> 
     ... 
    </body> 
</html> 

И это даст вам пункт, содержащий строку bar.

+1

Не объясняет оригинальную проблему, хотя ... – skaffman

+0

+1 для EL. Просто начинаю слышать некоторые технологии на стороне Java :) – Legend

+0

@skaffman - это оригинальная проблема (перенаправление не сохранение информации о сеансе). Фактически я использую атрибуты сеанса (атрибуты vs request), когда я хочу сохранить информацию через перенаправление, используя JBoss + Tomcat. –

1

Хотя не лучший подход (я предпочел бы использовать EL ${_session} чем скриптлета), это должно работать нормально. Ваша проблема лежит где-то в другом месте. Вы используете код, который, по вашему мнению, работает? Как вы компилируете и развертываете код? Разве вы не отделили слишком много от данного примера? Сеанс зависит от домена и контекста, если вы перенаправляетесь на другой домен и/или контекст, тогда будет создан новый сеанс. Кроме того, сеанс поддерживается cookie, есть ли в браузере файлы cookie? Кроме того, вам нужно будет использовать HttpServletResponse#encodeRedirectURL(), чтобы добавить идентификатор сеанса к URL-адресу переадресации.

response.sendRedirect(response.encodeRedirectURL("page2.jsp")); 

Update: для отладки, если это действительно же сессии, сделать в сервлет:

System.out.println("Session ID: " + session.getId()); 

и в JSP:

<p>Session ID: ${pageContext.session.id}</p> 

Также установка трекера заголовка HTTP, напримерПанельNet может принести новые идеи. Ответ HTTP должен содержать заголовок Set-Cookie с идентификатором сеанса, а последующие HTTP-запросы должны включать заголовок Cookie с тем же именем/значением cookie, как правило, JSESSIONID с длинным шестнадцатеричным значением, например, на this screenshot.


Update 2:, так как я был удивлён, потому что вперед, видимо, устраняет эту проблему, я попытался воспроизвести это на Tomcat 6 и Glassfish 3, но этот подход отлично работает на обоих серверах. Поэтому я подозреваю ошибку в контейнере, используемом Appengine, что он не устанавливает cookie правильно во время перенаправления.

В качестве доказательства, вот экран, который доказывает, что Glassfish устанавливает куки на Set-Cookieи обжиг редирект на Location:

alt text

+0

Я использую платформу Google App Engine. Написание нескольких сервлетов и jsp-файлов внутри проекта, созданного Eclipse. – Legend

+0

Просто попробовал ваш подход. Кажется, он ведет себя одинаково. – Legend

+1

+1 для вашего времени. – Legend

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