1

セッションが期限切れになる前に、 valueUnboundメソッドを使用してHttpSessionBindingListenerロック(データベースからのエントリ)を解放しています:

@Override

public void valueUnbound(HttpSessionBindingEvent event) {
  String user = (String) event.getSession().getAttribute("currentUsr");
  removeLock(user);
}

ロックが設定されている場合、ユーザー名をセッション変数として設定しています。
removelockメソッドにこの「ユーザー名」が必要です。しかし、getAttributeは例外をスローしています:

java.lang.IllegalStateException:getAttribute:セッションはすでに無効になっています

セッション変数を取得するのに助けが必要ですか?または、ユーザー名を取得する他の方法はありますか?


いいえ、セッションが無効になっているためです。

解決策はわかりましたが、valueBoundメソッドのサーブレットコンテキストを介して属性を設定し、 event.getSession()。getServletContext()。getAttribute( "cUser");を介して属性を取得しています。

それはうまくいきます。ありがとうEJP


私はあなたのポイントEJPを手に入れました、あなたは正しいです、私はそれを複雑にしています、私はevent.getValue()からそれを得ることができます。あなたの答えに+1、ありがとう。

4

1 に答える 1

2

私は解決策を見つけましたが、valueBoundメソッドのサーブレットコンテキストを介して属性を設定し、それを取得しています:event.getSession().getServletContext().getAttribute("cUser");

つまり、セッションスコープのデータをアプリケーションスコープに保存しているのです。このようにして、Webアプリのすべての訪問者間でデータが共有されることに気づいていますか?訪問者Xは、後でWebサイトにアクセスした訪問者Yによって設定された属性を確認します。それは問題を悪化させるだけです。

とにかく、具体的な問題に関しては、例外メッセージがあなたに伝えようとしているので、セッションはその時点ですでに無効になっています。これを解決するには2つの方法があります。

  1. を実装しているクラスcurrentUsrプロパティHttpSessionBindingListenerを作成して、個別のセッション属性として取得する必要がないようにします。

  2. HttpSessionListener代わりに使用してください。sessionDestroyed()メソッドは無効化の直前に呼び出されるため引き続きすべての属性にアクセスできます。

于 2011-07-11T10:03:32.660 に答える