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());
}
}
Где вы прочли последнюю цитату? – Beryllium
@Beryllium Какую цитату вы говорите? –
«Сессия создается, когда ваши кодовые звонки ...» – Beryllium