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

276

Когда / каковы условия, когда JSESSIONIDсоздается?

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

joshjdevl
источник

Ответы:

324

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

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

SRV.7.3 Session Scope

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

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

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

Петр Штибраны
источник
2
нельзя ли создать сеанс без явного вызова getSession? в отношении «никогда не должен передаваться между контекстами контейнером», у websphere есть возможность делиться сессиями, что является мотивацией для вопроса :)
joshjdevl
Нет, если вы используете только Servlet API. Тем не менее, могут быть специфичные для сервера расширения (например, совместное использование сеансов Websphere, как вы указали).
Питер Штибраны
Я полагаю, что ваш файл context.xml может управлять автоматическим созданием сеанса, если ваш тег <Context> содержит атрибут cookie, например, <Context cookies = "false">
BT
Прямо сейчас я получаю много обращений к моему фильтру для создания сеанса, и кажется, что это только после создания второго попадания (не обновления второй страницы), это вызвало мое внимание: «сеанс не обязательно создается по первому запросу ...» это связано? Не могли бы вы привести пример, почему это не обязательно создается при первом запросе? Спасибо!
jpganz18
@ jpganz18: Если вы просто позвоните request.getSession()или request.getSession(true), то вы получите либо существующий, либо новый сеанс. Однако, если ваш код вызывает request.getSession(false), вы получаете либо существующий сеанс, либо ноль, если сеанс не существует.
Петр Штибраны
49

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

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

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

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

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

<%@ page session="false" %>

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

Рангачари Ананд
источник
3
Другими словами: значением по умолчанию для атрибута сеанса страницы является «true». Что может быть неожиданным в некоторых (многих?) Случаях.
Давид Балажич
Я тоже на tomcat, и я вообще не использую jsp, но куки-файл сессии создается в любом случае. Есть идеи как предотвратить это в этой ситуации?
ClassyPimp
23

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

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

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

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

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

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

Пн.
источник
1
Четкое объяснение объема сеанса.
user3123690
@ Ссылка не работает
Тимофей
8

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

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

polaretto
источник
Вы имеете в виду установить page session = false во всех включенных фрагментах (.jsp и .jspf) и не включать его в основной jsp, включающий остальные фрагменты?
Ommadawn
2

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

<%@ page session="false" %>

в JSP

И

request.getSession().invalidate();

в действии Struts

Джером Ягла
источник