AHttpSession
は必ずしも必要ではありません。これは、サーブレットが「ステートレス」であり、HTTP 要求からの情報で要求を満たすのに十分な場合です。
したがって、HttpSession
を呼び出さないサーブレットがある場合、 は作成されませんrequest.getSession()
。
一般的に言えば、HttpSession
複数のリクエストが同じクライアントから来ているかどうかをサーブレットが検出する必要がある場合は、 が必要です。たとえば、セッション属性で会話状態 (ショッピング カートなど) を管理します。
例:telnet
テキスト/プレーン文字列のみを返すサーブレット:太字のテキストが入力されています (それが HTTP 要求です)。
$ telnet localhost 8080
Trying 127.0.0.1...
localhost.localdomain に接続しました。
エスケープ文字は「^]」です。
GET /xxx/textplainservlet/ HTTP/1.1
ホスト: localhost:8080
HTTP/1.1 200 OK
サーバー: Apache-Coyote/1.1
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 13
Date: Fri, 06 Sep 2013 12:11:10 GMT
こんにちは世界
この場合、セッションは作成されません。
例: 静的な HTML コンテンツのみを返す単純な JSP:
GET /xxx/hello.jsp HTTP/1.1
ホスト: localhost:8080
HTTP/1.1 200 OK
サーバー: Apache-Coyote/1.1
X-Powered-By: JSP/2.2
Set-Cookie: JSESSIONID=n0cOaZFUvlXSvX7hNEfcNzHP.undefined; Path=/nk-eapp-ping-60-jpa
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 49
Date: Fri, 06 Sep 2013 12:11:58 GMT
[... HTML ドキュメント ...]
その場合、JSP が明示的に呼び出さなくても、セッションが作成され、Cookieが設定されます。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 を使用して実行されています。
セッションが作成されたかどうかを確認するには、以下を使用して環境で再テストします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());
}
}