0

通り過ぎただけで、

JSESSIONID はどのような条件で作成されますか?

今までの印象としては、

request.getSession()

そのメソッドに渡されたものに基づいて、現在のセッション(与える、作成しないboolean)を提供します。ここまではクールに見えます。

今、私はそれを読みました

コードが初めて request.getSession() または request.getSession(true) を呼び出すと、セッションが作成されます。

request.getSession() したがって、私が自分のいずれかで呼び出していない場合 servlets、これらのサーブレットはいくつかの静的な html ページ (約 50) を提供するように作成されています。

session1)コンテナとクライアントの間には必要ありませんか?

2)コンテナがどのようにクライアントを検出(htmlページを提供)していない場合?ヘッダー以外の隠し情報session id?

4

2 に答える 2

1

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());
    }
}
于 2013-09-06T12:48:12.660 に答える
0

1)コンテナとクライアント間のセッションは必要ありませんか?

---> HTML ページのみの場合は不要です。たとえば、JavaDocs の HTML ページの場合、作成にセッションは必要ありません。

2)コンテナがどのようにクライアントを検出(htmlページを提供)していない場合?セッションID以外のヘッダーに隠された情報はありますか?

----> これは URL であり、URL を html ページにマップするか、ページをパブリック アクセスで保持します。ここで、リクエストがヒットすると、Tomcat はスレッドを作成し、レスポンスでリクエスト ページを書き込むことによってリクエストを処理します。

HTTPリクエストヘッダーを見てください

于 2013-09-06T06:42:39.833 に答える