Відповіді:
Файл cookie JSESSIONID створюється / надсилається під час створення сеансу. Сесія створюється, коли ваш код дзвонить request.getSession()
або request.getSession(true)
вперше. Якщо ви просто хочете отримати сеанс, але не створювати його, якщо його не існує, використовуйте request.getSession(false)
- це поверне вам сеанс або null
. У цьому випадку новий сеанс не створюється, а cookie JSESSIONID не надсилається. (Це також означає, що сеанс не обов'язково створюється за першим запитом ... ви та ваш код контролюєте під час створення сеансу)
Сесії залежать від контексту:
SRV.7.3 Область сеансу
Об'єкти HttpSession повинні бути визначені на рівні програми (або контексту сервлета). Базовий механізм, такий як файл cookie, який використовується для встановлення сеансу, може бути однаковим для різних контекстів, але посилається на об'єкт, включаючи атрибути в цьому об'єкті, ніколи не слід розподіляти контейнери між контекстами.
Оновлення: Кожен дзвінок на сторінку JSP неявно створює новий сеанс, якщо ще немає сеансу. Це можна вимкнути за допомогою session='false'
директиви сторінки, і в цьому випадку змінна сесія взагалі недоступна на сторінці JSP.
request.getSession()
або request.getSession(true)
, ви отримаєте або існуючий, або новий сеанс. Однак якщо ваш код зателефонує request.getSession(false)
, ви отримуєте або існуючий сеанс, або нульовий, якщо сеансу не існує.
Ось деякі відомості про ще одне джерело JSESSIONID
файлу cookie:
Я просто налагоджував якийсь код Java, який працює на сервері tomcat. Я не дзвонив request.getSession()
явно нікуди в свій код, але я помітив, що aJSESSIONID
файл cookie все ще встановлюється.
Нарешті я подивився на згенерований код Java, що відповідає JSP, у робочому каталозі під Tomcat.
Здається, що вам подобається чи ні, якщо ви викликаєте JSP з сервлета, JSESSIONID
вийде створити!
Додано: Я щойно це з’ясував, додавши таку директиву JSP:
<%@ page session="false" %>
ви можете відключити налаштування JSESSIONID
за допомогою JSP.
КОРЕКЦІЯ: Будь ласка, проголосуйте за відповідь Петра Штібрані - це більш правильно і повно!
"JSESSIONID" - це унікальний ідентифікатор сеансу http - дивіться javadoc тут . Там ви знайдете таке речення
Інформація про сеанс охоплюється лише поточною веб-програмою (ServletContext), тому інформація, що зберігається в одному контексті, не буде безпосередньо видимою в іншому.
Отже, коли ви вперше потрапляєте на сайт, створюється новий сеанс і прив'язується до SevletContext. Якщо ви розгортаєте кілька додатків, сеанс не надається спільним.
Ви також можете визнати недійсним поточний сеанс і, отже, створити новий. наприклад, при переході з http на https (після входу в систему) дуже гарна ідея створити новий сеанс.
Сподіваюся, це відповідає на ваше запитання.
Остерігайтеся, якщо на вашій сторінці є інші .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>
щоб увімкнути сценарії всередині них.
Для посилань, створених у JSP із спеціальними тегами, мені довелося використовувати
<%@ page session="false" %>
в ПСП
І
request.getSession().invalidate();
в акції "Струць"