0

サーブレットAがユーザーを次のようなセッションにバインドするとします。

HttpSession session = req.getSession(true);

そして、その同じユーザーは、 servltAの同じアプリケーションに属するサーブレットBでリクエストを実行した直後です。

この時点でサーブレットBが実行されると:

HttpSession session = req.getSession(false);

セッションはnullですか?

4

4 に答える 4

4

このコードがnullを返す理由として考えられるものは次のとおりです。

  • 2番目の呼び出しは、セッションがタイムアウトした後に送信されます
  • サーバーを再起動するか、2つの呼び出しの間にアプリを再デプロイしました
  • 2つの呼び出しの間にブラウザを再起動しました
  • 2つの異なるブラウザまたはマシンを使用して2つの呼び出しを実行しました
  • ブラウザがCookieを拒否し、URL書き換えセッショントラッキングが機能するようにURLを適切にエンコードしていませんでした
  • 2つの呼び出しの間の別の呼び出しは、セッションを無効にしました
  • 実際、両方のサーブレットは同じWebアプリケーションにありません
于 2012-10-13T17:21:00.303 に答える
1

HttpServletRequest#getSession

true必要に応じて、このリクエストの新しいセッションを作成します。現在のセッションがない場合にfalsenullを返す

2番目のサーブレットのリクエストでセッションIDを受け取っていることを確認する必要があります。あなたはそれを使ってそれをすることができますgetRequestedSessionId

session idこれは、2つの呼び出しの間、またはブラウザが呼び出しを行う前にセッションが無効になった場合にのみ発生する可能性があります。SeveletB

于 2012-10-13T17:16:46.913 に答える
0

実際には、サーブレットの順序によって異なります。

  • サーブレットBがAの前に呼び出される場合、セッションは作成されません
  • サーブレットAがBの前に呼び出される場合、セッションが作成され、サーブレットBがそれにアクセスできます。

一般に、セッションの自動作成を避けたい場合は、セッションを作成するコードの前に、セッションを使用するコードが実行されないようにする必要があります。

したがって、セッションがnullの場合は、ユーザーをサーブレットBからサーブレットAにリダイレクトすることをお勧めします。

于 2012-10-13T17:18:52.807 に答える
0

あなたが述べたように、servletA最初とservletB次と呼ばれます。

あなたが言及したように何も起こらない場合、で使用/作成されたのと同じセッション( null ではない)を受け取ります。servletBservletA

サーブレットAでは、

      getSession(true) in servletA means create and return the session if not 
      present otherwise return the existing session

サーブレットBでは、

      getSession(false) in servletB means return the existing session if present 
      otherwise return null.

確かにセッションは既に作成されているため、セッションの有効期限が切れるなど、セッションを消去するための 2 つの呼び出しの間に何も起こらなければ、 null でないセッションservletAを受け取ります。servletB

于 2012-10-14T18:33:01.133 に答える