web-dev-qa-db-ja.com

Java HttpSession

HttpSessionはJavaサーブレットは、後にのみ作成されます

_HttpSession s = request.getSession();
_

私のコードではそれを書いていませんが、if (request.getSession(false) == null) ...を使用すると、機能しません。どうして?

13
Sergey

Request.getSession()を呼び出すと、HttpSessionが作成されます。

ただしデフォルトでJSPにアクセスすると、セッションが自動的に作成されます。この動作は、次を使用して無効にできます。<%@ page session="false">

JSPを使用していますか?

17
Wilhelm Kleu

JavaDocsを読んでください、それははっきりと言います:

これは、 request.getSession()

このリクエストに関連付けられている現在のセッションを返します。リクエストにセッションがない場合は、セッションを作成します。

そして他の変種 request.getSession(isCreate)

このリクエストに関連付けられている現在のHttpSessionを返します。現在のセッションがなく、createがtrueの場合は、新しいセッションを返します。

createがfalseで、リクエストに有効なHttpSessionがない場合、このメソッドはnullを返します。

セッションが適切に維持されていることを確認するには、応答がコミットされる前にこのメソッドを呼び出す必要があります。コンテナがセッションの整合性を維持するためにCookieを使用していて、応答がコミットされたときに新しいセッションを作成するように求められた場合、IllegalStateExceptionがスローされます。


更新

少し調べてみると、request.getSession()どこかと呼ばれない限り、セッションは作成されないことがわかりました。以来、_The servlet container uses this interface to create a session between an HTTP client and an HTTP server._サーブレットコンテナがデフォルトでセッションを作成する可能性が高いです。

参照:

  1. Java Doc HttpSession
  2. JavaRaunchに関する議論: HttpSessionは自動的に作成されますか?

ただし、安全のために、request.getSession()を使用してセッションを取得し、セッションが既に作成されているかどうかを確認する必要がある場合にのみrequest.getSession(false)を使用してください。

15
Nishant

Nishantの回答に加えて、<%@ page session = "false" %>でセッションを作成しないように構成しない限り、JSPページによってセッションを暗黙的に作成できることに注意してください。

3
axtavt

それを完了するには:

  • サーブレットでrequest.getSession()を呼び出さない限り、セッションは作成されません。request.getSession(false)を使用して、新しいセッションを作成せずに既存のセッションを取得します。
  • jSPページを使用する場合、_<%@ page session="false" %>_を指定しない限り、セッションは自動的に作成されます-変数session-
  • セッションが自動的に作成された場合でも、session.isNew()を使用して、セッションが新しく作成されたかどうかを確認できます。
1
peenut

ブラウザからセッションCookieを削除して、別のテストを行ってみてください。それが機能しない場合は、他のコンポーネントがその呼び出しの前に新しいセッションを作成しています。

0
M.L.