2013-09-28 4 views
1

У меня возникла проблема с переменными сеанса, которые недоступны, когда запрос пришел из имени домена, а не localhost. Например, если установить переменную пользователя:Java-сессия для каждого запроса?

request.getSession(true).setAttribute("user", user); 
//Redirects to another html page or something... 

Когда клиент делает еще один запрос, и я пытаюсь получить доступ к переменной сеанса пользователя она возвращает нуль.

//Client makes another request to the server 
request.getSession(true).getAttribute("user"); //returns null 

Я заметил, что при каждом запросе устанавливается новый файл cookie JSESSIONID и изменяется значение идентификатора. Означает ли это, что новый сеанс создается каждый раз, когда клиент обращается к серверу? Как мне поддерживать один и тот же сеанс между клиентом, чтобы я мог хранить объекты в HttpSession и иметь к ним доступ?

Я не знаю, имеет ли это какое-либо отношение ни к чему, но при просмотре приложения из диспетчера tomcat количество сеансов продолжает расти независимо от того, что я использую приложение из того же окна браузера , не обновляя страницу или что-то еще. Другой признак того, что новый сеанс создается по каждому запросу на сервер?

Это происходит только при обращении к приложению от имени домена ex: example.com/app. При переходе с localhost переменные сеанса работают нормально.

Update

Я тестировал без использования response.sendRedirect и переменная сессии доступна, пока я не переключать страницы и сделать еще один запрос на сервер. Это подтверждает мои подозрения, что с каждым запросом создается новый сеанс. Это не перенаправление, которое убивает сессию, ее новый запрос. Как я могу это предотвратить?

ответ

0

Проблема была с пути в куки JSESSIONID. Я до сих пор не могу понять, почему это было быть установлено в приложении имя-TOMCAT приложений Tomcat путь//, но я изменил конфигурацию печенья в web.xml для:

<session-config> 
    <cookie-config> 
    <name>JSESSIONID</name> 
    <path>/</path> 
    <http-only>true</http-only> 
    <secure>true</secure> 
    </cookie-config> 
</session-config> 

А теперь переменные сессии работая через сеансы. Конечно, теперь переменные сеанса не работают при работе с localhost. Вместо этого вы можете установить sessionCookiePath в корневом узле context.xml:

Я использую сервер ubuntu и tomcat7. Для tomcat7, context.xml можно найти в /etc/tomcat7/context.xml.

<Context ... sessionCookiePath="/" > ... </Context> 

Теперь, вы должны быть в состоянии работать на местном уровне (если вы не изменяли, что cookiepath на локальном компьютере), а также на сервере без необходимости настройки куки JSESSIONID в приложениях web.xml.

0

Как вы делаете перенаправление? Вы вызываете HttpServletResponse.encodeRedirectURL() заранее?

Читать the javadoc here

Вы бы использовать его как response.sendRedirect(response.encodeRedirectURL(path));

+0

Чтобы перенаправить на другую страницу, я использую response.sendRedirect (путь). Должен ли я использовать что-то другое? – ryandlf

+0

Он говорит, что encodeRedirectUrl устарел ... – ryandlf

+0

encodeRedirectUrl устарел, encodeRedirectURL не является (обратите внимание, как он заканчивается URL-адресом не Url. И да, вам нужно вызвать его перед выполнением перенаправления. Что-то вроде sendRedirect (encodeRedirectURL (путь)). –

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