За яких умов створюється JSESSIONID?


276

Коли / які умови JSESSIONIDстворюються?

Це на домен? Наприклад, якщо у мене є сервер додатків Tomcat і я розгортаю кілька веб-додатків, буде створено інше в JSESSIONIDзалежності від контексту (веб-додаток), або воно поділяється між веб-додатками, якщо вони є одним доменом?

Відповіді:


324

Файл cookie JSESSIONID створюється / надсилається під час створення сеансу. Сесія створюється, коли ваш код дзвонить request.getSession()або request.getSession(true)вперше. Якщо ви просто хочете отримати сеанс, але не створювати його, якщо його не існує, використовуйте request.getSession(false)- це поверне вам сеанс або null. У цьому випадку новий сеанс не створюється, а cookie JSESSIONID не надсилається. (Це також означає, що сеанс не обов'язково створюється за першим запитом ... ви та ваш код контролюєте під час створення сеансу)

Сесії залежать від контексту:

SRV.7.3 Область сеансу

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

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

Оновлення: Кожен дзвінок на сторінку JSP неявно створює новий сеанс, якщо ще немає сеансу. Це можна вимкнути за допомогою session='false'директиви сторінки, і в цьому випадку змінна сесія взагалі недоступна на сторінці JSP.


2
не можна створити сеанс без явного виклику getSession? що стосується "ніколи не слід розподіляти контейнери між контекстами", у веб-сфери є можливість ділитися сеансами, що є мотивацією для питання :)
joshjdevl

Ні, якщо ви використовуєте лише сервлет API. Однак можуть бути розширення, характерні для сервера (наприклад, обмін сеансами Websphere, як ви вказуєте).
Peter Štibraný

Я вважаю, що ваш файл context.xml може контролювати автоматичне створення сеансу, якщо ваш тег <Context> містить атрибут cookie, наприклад <Context cookies = "false">
BT

Зараз я отримую багато звернень до свого фільтра, щоб створити сеанс, і здається, що його створюють лише після другого звернення (не оновлення другої сторінки), це викликало мою увагу "сеанс не обов’язково створюється за першим запитом .." це пов’язано? Ви можете навести приклад, чому це не обов'язково створюється за першим запитом? Дякую!
jpganz18

@ jpganz18: Якщо ви просто зателефонували request.getSession()або request.getSession(true), ви отримаєте або існуючий, або новий сеанс. Однак якщо ваш код зателефонує request.getSession(false), ви отримуєте або існуючий сеанс, або нульовий, якщо сеансу не існує.
Петро Штібрані

49

Ось деякі відомості про ще одне джерело JSESSIONID файлу cookie:

Я просто налагоджував якийсь код Java, який працює на сервері tomcat. Я не дзвонив request.getSession()явно нікуди в свій код, але я помітив, що aJSESSIONID файл cookie все ще встановлюється.

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

Здається, що вам подобається чи ні, якщо ви викликаєте JSP з сервлета, JSESSIONID вийде створити!

Додано: Я щойно це з’ясував, додавши таку директиву JSP:

<%@ page session="false" %>

ви можете відключити налаштування JSESSIONIDза допомогою JSP.


3
Іншими словами: значення за замовчуванням для атрибута сеансу сторінки - "вірно". Що може бути несподіваним у деяких (багатьох?) Випадках.
Девід Балажич

Я також на tomcat, і jsp взагалі не використовую, але сесійне cookie все одно створюється. Будь-яка ідея, як запобігти цьому в цій ситуації?
ClassyPimp

23

КОРЕКЦІЯ: Будь ласка, проголосуйте за відповідь Петра Штібрані - це більш правильно і повно!

"JSESSIONID" - це унікальний ідентифікатор сеансу http - дивіться javadoc тут . Там ви знайдете таке речення

Інформація про сеанс охоплюється лише поточною веб-програмою (ServletContext), тому інформація, що зберігається в одному контексті, не буде безпосередньо видимою в іншому.

Отже, коли ви вперше потрапляєте на сайт, створюється новий сеанс і прив'язується до SevletContext. Якщо ви розгортаєте кілька додатків, сеанс не надається спільним.

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

Сподіваюся, це відповідає на ваше запитання.


1
Чітке пояснення обсягу сеансу.
user3123690

@Mo посилання розірвана
Тимофей

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>

щоб увімкнути сценарії всередині них.


Ви маєте на увазі set set session = false у всіх включених фрагментах (.jsp та .jspf), і не включаєте їх до головного jsp, що включає решту фрагментів?
Оммадаун

2

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

<%@ page session="false" %>

в ПСП

І

request.getSession().invalidate();

в акції "Струць"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.