При каких условиях создается JSESSIONID? - PullRequest
253 голосов
/ 27 февраля 2009

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

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

Ответы [ 5 ]

297 голосов
/ 01 марта 2009

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

Сеансы для каждого контекста:

SRV.7.3 Session Scope

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

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

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

44 голосов
/ 29 сентября 2009

Вот некоторая информация об еще одном источнике файла cookie JSESSIONID:

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

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

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

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

<%@ page session="false" %>

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

20 голосов
/ 01 марта 2009

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

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

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

Итак, когда вы впервые заходите на сайт, создается новый сеанс и привязывается к SevletContext. При развертывании нескольких приложений сеанс не является общим.

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

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

7 голосов
/ 19 июня 2013

Осторожно, если ваша страница включает в себя другие .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>

для включения скриплетов внутри них.

1 голос
/ 10 октября 2009

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

<%@ page session="false" %>

в JSP

И

request.getSession().invalidate();

в действии Struts

...