2009-02-27 4 views
230

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

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

ответ

267

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

сессий в контекстном:

SRV.7.3 Сессионный масштаб

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

(Servlet 2.4 specification)

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

+1

Невозможно создать сеанс без явного вызова getSession? В отношении «никогда не должно быть разделено между контекстами контейнером», у websphere есть возможность обмениваться сеансами, что является мотивацией для вопроса :) – joshjdevl

+0

Нет, если вы используете только API сервлета. Однако могут существовать расширения для сервера (например, совместное использование Websphere, когда вы указываете). –

+0

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

16

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

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

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

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

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

+1

Четкое пояснение объема сеанса. – user3123690

+0

@Mo ссылка не работает – Tim

37

Вот некоторая информация о более одного источника JSESSIONID печенья:

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

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

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

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

<%@ page session="false" %> 

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

+3

Другими словами: значение по умолчанию для атрибута сеанса страницы равно «true». Что может быть неожиданным в некоторых (много?) Случаях. –

+0

Я тоже на tomcat, и я вообще не использую jsp, но cookie сеанса создается в любом случае. Любая идея, как предотвратить это в этой ситуации? – ClassyPimp

1

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

<%@ page session="false" %> 

в JSP

И

request.getSession().invalidate(); 

в Действие Struts

7

Остерегайтесь, если ваша страница включает в себя другие .jsp или .jspf (фрагмент)! Если вы не установили

<%@ page session="false" %> 

на них, а также, родительская страница будет в конечном итоге, начиная новую сессию и настройка куки JSESSIONID.

Для .jspf страниц, в частности, это происходит, если вы настроили ваш web.xml с такой сниппет:

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jspf</url-pattern> 
    </jsp-property-group> 
</jsp-config> 

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

Смежные вопросы