2

私はかなり奇妙な問題を経験しています。2 人のユーザーがまったく同時にログインしている場合、そのうちの 1 人が他のユーザーとして検出されます。

    locale = new Locale(getLocale(request).getLanguage(), getLocale(request).getCountry());


    strRemoteUser = WebTools.getUserIdWithoutDomainName(request.getRemoteUser()).toUpperCase();

    logger.info("[MYAPP] User " + strRemoteUser + " is logging in");

    logger.info("[MYAPP] Creating session for : " + strRemoteUser);

    HttpSession session = request.getSession(false);

    if (session != null) {

        session.invalidate();
        session = request.getSession();
    }       

    logger.info("[MYAPP] User in session is : " + strRemoteUser);             

私が得るものは次のとおりです。2 人のユーザー (USR001 と USR002) がまったく同時にアプリケーションにログインしているとします。それらは別の場所にあります。

ログ:

    2013-05-14 08:19:38,550 INFO  [com.myapp.action.common.LoginAction] [MYAPP] User USR001 is logging in
2013-05-14 08:19:38,551 INFO  [com.myapp.action.common.LoginAction] [MYAPP] Creating session for : USR001
2013-05-14 08:19:38,760 INFO  [com.myapp.action.common.LoginAction] [MYAPP] User USR002 is logging in
2013-05-14 08:19:38,761 INFO  [com.myapp.action.common.LoginAction] [MYAPP] Creating session for : USR002
2013-05-14 08:19:38,834 INFO  [com.myapp.action.common.LoginAction] [MYAPP] User in session is : USR002
2013-05-14 08:19:39,104 INFO  [com.myapp.action.common.LoginAction] [MYAPP] User in session is : USR002
2013-05-14 08:19:39,425 INFO  [com.myapp.action.common.LoginAction] [MYAPP] Auto Added User USR002
2013-05-14 08:19:39,550 INFO  [com.myapp.action.common.LoginAction] [MYAPP] Setting user in session: USR002 (673)

ご覧のとおり、USR001 が USR002 として認識されるようになったため、USR002 が同時セッション作成を「勝ち取り」ます。USR001 がログアウトしてから再度ログインすると、正常に動作します。

何か考え/アドバイスはありますか?

助けてくれてどうもありがとう。

仕様:

  • jBoss 4.2.3GA
  • PostgreSQL 9.0.3
  • ストラット 1.3.5
  • EJB3
4

2 に答える 2

1

多くの開発者は、Struts 1 がの単一インスタンスを使用Actionしてすべてのセッションからのリクエストを処理するという事実を見逃していActionます。

  • 不変 (最終) フィールドのみを使用する
  • 可変フィールドの代わりにローカル変数を使用する
  • CalendarSimpleDateFormatおよびのようなスレッドセーフでないクラスに注意してくださいMatcher

もちろん、もっと微妙な問題がたくさんあり、そこから学べるリソースがたくさんあります (たとえば、Brian Goetz による Java Concurrency in Practice)。

元の Apache Struts ドキュメントのPSアクション クラス設計ガイドライン

于 2013-05-16T19:31:32.280 に答える