2013-09-06 2 views
0

Просто я прошел,request.getSession() получает сеанс или создает сеанс?

Under what conditions is a JSESSIONID created?

До сих пор я нахожусь в впечатление, что,

request.getSession()

дает мне текущий сеанс (даяние, не создавая) на основе boolean перешел к этому методу. Смотрится прохладно до здесь.

Теперь я прочитал, что

Сессия создается, когда ваш код вызывает request.getSession() или request.getSession (истина), в первый раз.

Итак, если я не называю request.getSession() в мой любой из servlets, И эти сервлеты сделаны служить некоторые статические HTML-страниц (около 50),

1) Там нет необходимости в session между контейнером и клиентом?

2) Если какой-либо контейнер не обнаруживает (обслуживает страницу html-страницу) какую-либо скрытую информацию в заголовках, отличных от session id?

+0

Где вы прочли последнюю цитату? – Beryllium

+0

@Beryllium Какую цитату вы говорите? –

+0

«Сессия создается, когда ваши кодовые звонки ...» – Beryllium

ответ

0

1) Нет необходимости в сеансе между контейнером и клиентом?

---> Не требуется, если это просто html-страницы, например. Страницы JavaDocs html, вам не нужен сеанс для создания.

2) Если какой-либо контейнер не обнаруживает (обслуживает страницу html-страницу) какую-либо скрытую информацию в заголовках, отличных от идентификатора сеанса?

----> Это URL-адрес, и вы указываете URL-адрес с помощью html-страницы или просто сохраняете свои страницы с открытым доступом. Здесь, если запрос попал, tomcat создаст поток, который будет служить запросу, написав страницу запроса в ответ.

Посмотрите на HTTP Request header

1

HttpSession не всегда требуется. Это так, если сервлет «без гражданства», а информация из HTTP-запроса достаточна для выполнения запроса.

Так что HttpSession не создан, если у вас есть сервлеты, которые не звонят request.getSession().

Вообще говоря, требуется HttpSession, если сервлет должен определить, поступает ли от одного клиента несколько запросов. Например, чтобы управлять диалоговым состоянием (например, корзиной покупок и т. Д.) В атрибуте сеанса.


Пример: telnet в сервлет, который возвращает только текст/простую строку: текст в жирного был набран в (это запрос HTTP)

$ телнет локального 8080
Попытка 127.0.0.1 ...
Подключен к localhost.localdomain.
Escape character is '^]'.
GET/ххх/textplainservlet/HTTP/1.1
Ведущий: локальный: 8080

HTTP/1.1 200 OK
Сервер: Apache-Coyote/1,1
Content-Type: Текст/равнину; кодировка = ISO-8859-1
Content-Length: 13
Дата: Пт, 6 сентября 2013 12:11:10 GMT

Привет, мир

В этом случае не создается сечение.


Пример: простой JSP, который не возвращает ничего, кроме статического контента HTML:

GET /xxx/hello.jsp HTTP/1.1
Хост: локальный: 8080

HTTP/1.1 200 OK
Сервер: Apache-Coyote/1.1
X-Powered-By: JSP/2. 2
Set-Cookie: JSESSIONID = n0cOaZFUvlXSvX7hNEfcNzHP.undefined; Path =/пк-eapp-пинг-60-JPA
Content-Type: Текст/html; кодировка = ISO-8859-1
Content-Length: 49
Дата: Пт, 6 сентября 2013 12:11:58 GMT

[... HTML документ ...]

В этом случае сеанс создается, а печенье установлен, даже если JSP не вызывает request.getSession() явно !

Поэтому я приложил HttpSessionListener, и действительно, сеанс создается неявно. В этом слушателю я сбрасывали трассировки стека:

org.apache.catalina.session.StandardSession.tellNew (StandardSession.java:374)
org.apache.catalina.session.StandardSession.setId (StandardSession.java : 344)
org.apache.catalina.session.ManagerBase.createSession (ManagerBase.java:506)
org.apache.catalina.session.StandardManager.createSession (StandardManager.java:297)
org.apache.catalina .connector.Request.doGetSession (Request.java:2665)
org.apache.catalina.connector.Request.getSession (Request.java:2375)
org.apache.catalina.connector.RequestFacade.getSession (RequestFacade.java:841)
org.apache.catalina.connector.RequestFacade.getSession (RequestFacade.java:852)
org.apache.jasper.runtime. PageContextImpl._initialize (PageContextImpl.Java: 146)
org.apache.jasper.runtime.PageContextImpl.initialize (PageContextImpl.java:124)
org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext (JspFactoryImpl.java:106)
org.apache. jasper.runtime.JspFactoryImpl.getPageContext (JspFactoryImpl.java:62)
org.apache.jsp.hello_jsp._jspService (hello_jsp.java:45)

Эти тесты были запустить с помощью JBoss 7.


К ch eck, если сеанс создан или нет, просто повторно проверьте его в своей среде с помощью HttpSessionListener:

@WebListener 
public class MyHttpSessionListener implements HttpSessionListener { 
    private final static Logger log = Logger 
      .getLogger(MyHttpSessionListener.class.getName()); 

    public void sessionCreated(HttpSessionEvent e) { 
     // Possibly create a stack trace here, and dump it 
     log.info("Session created: " + e.getSession().getId() + ", timeout " 
       + e.getSession().getMaxInactiveInterval()); 
    } 

    public void sessionDestroyed(HttpSessionEvent e) { 
     log.info("Session destroyed: " + e.getSession().getId()); 
    } 
}