При каких условиях создается JSESSIONID?

Когда / при каких условиях JSESSIONID создается?

Это за домен? Например, если у меня есть сервер приложений Tomcat и я развертываю несколько веб-приложений, будет JSESSIONID ли создаваться другой для каждого контекста (веб-приложения), или он будет использоваться совместно веб-приложениями, если они находятся в одном домене?

Ответов (5)

Решение

Файл cookie JSESSIONID создается / отправляется при создании сеанса. Сессия создается при вызове вашего кода request.getSession() или request.getSession(true) в первый раз. Если вы просто хотите получить сеанс, но не создавать его, если он не существует, используйте request.getSession(false) - это вернет вам сеанс или null . В этом случае новый сеанс не создается, и cookie JSESSIONID не отправляется. (Это также означает, что сеанс не обязательно создается по первому запросу ... вы и ваш код контролируете, когда сеанс создается)

Сеансы зависят от контекста:

SRV.7.3 Объем сеанса

Объекты HttpSession должны иметь область видимости на уровне приложения (или контекста сервлета). Базовый механизм, такой как cookie, используемый для установления сеанса, может быть одинаковым для разных контекстов, но объект, на который имеется ссылка, включая атрибуты в этом объекте, никогда не должен совместно использоваться контейнером между контекстами.

( Спецификация сервлета 2.4 )

Обновление: каждый вызов страницы JSP неявно создает новый сеанс, если сеанса еще нет. Это можно отключить с помощью session='false' директивы page, и в этом случае переменная сеанса вообще недоступна на странице JSP.

Остерегайтесь, если ваша страница содержит другие файлы .jsp или .jspf (фрагменты)! Если вы не установите

<%@ page session="false" %>

на них родительская страница в конечном итоге запустит новый сеанс и установит файл cookie JSESSIONID.

В частности, для страниц .jspf это произойдет, если вы настроили свой web.xml с таким фрагментом:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

чтобы включить в них скриптлеты.

ИСПРАВЛЕНИЕ: Проголосуйте за ответ Петра Штибраны - он более правильный и полный!

«JSESSIONID» - это уникальный идентификатор http-сеанса - см. Javadoc здесь . Там вы найдете следующее предложение

Информация о сеансе ограничена только текущим веб-приложением (ServletContext), поэтому информация, хранящаяся в одном контексте, не будет напрямую видна в другом.

Поэтому, когда вы впервые попадаете на сайт, создается новый сеанс, который привязывается к SevletContext. Если вы развертываете несколько приложений, сеанс не используется совместно.

Вы также можете аннулировать текущий сеанс и, следовательно, создать новый. например, при переключении с http на https (после входа в систему) рекомендуется создать новый сеанс.

Надеюсь, что это ответ на ваш вопрос.

Here is some information about one more source of the JSESSIONID cookie:

Я просто отлаживал код Java, работающий на сервере Tomcat. Я не вызывал request.getSession() явно нигде в моем коде, но заметил, что JSESSIONID cookie все еще устанавливается.

Наконец, я взглянул на сгенерированный код Java, соответствующий JSP, в рабочем каталоге Tomcat.

Похоже, нравится вам это или нет, но если вы вызовете JSP из сервлета, он JSESSIONID будет создан!

Добавлено: я обнаружил это, добавив следующую директиву JSP:

<%@ page session="false" %>

вы можете отключить настройку JSESSIONID с помощью JSP.

Для ссылок, созданных в JSP с настраиваемыми тегами, мне пришлось использовать

<%@ page session="false" %>

в JSP

А ТАКЖЕ

request.getSession().invalidate();

в действии Struts