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

Когда/какие условия возникают при создании JSESSIOINID?

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

Ответ 1

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

Сеансы относятся к контексту:

SRV.7.3 Сфера охвата сеанса

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

(спецификация Servlet 2.4)

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

Ответ 2

Ниже приведена информация о еще одном источнике файла JSESSIONID:

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

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

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

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

<%@ page session="false" %>

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

Ответ 3

КОРРЕКЦИЯ: Пожалуйста, проголосуйте за Петра Štibraný ответ - это более правильно и полно!

"JSESSIONID" - это уникальный идентификатор сеанса http - см. здесь javadoc. В javadoc вы найдете следующее предложение: "Информация о сеансе ограничена только текущим веб-приложением (ServletContext), поэтому информация, хранящаяся в одном контексте, не будет непосредственно видна в другом".

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

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

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

Ответ 4

Остерегайтесь, если ваша страница содержит другие .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>

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

Ответ 5

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

<%@ page session="false" %>

в JSP

и

request.getSession().invalidate();

в действии Struts