并发HTTP会话返回错误的用户

时间:2013-05-14 12:40:16

标签: java session struts struts-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);             

我得到的是以下内容。假设两个用户(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)

如您所见,USR002“赢得”并发会话创建,因为USR001现在被认为是USR002。如果USR001注销然后重新登录,则可以正常运行。

有任何想法/建议吗?

非常感谢您的帮助。

规格:

  • jBoss 4.2.3GA
  • PostgreSQL 9.0.3
  • Struts 1.3.5
  • EJB3

2 个答案:

答案 0 :(得分:1)

我很高兴它有所帮助。这是发布的评论 回答:如果我们谈论同样的事情,这些都是经典的并发问题。将变量移动到方法中并再次运行它并查看输出。

答案 1 :(得分:1)

许多开发人员都错过了Struts 1使用{em>单个实例 Action来处理来自所有会话的请求的事实,因此Action应该以并发安全的方式编写,例如

  • 仅使用不可变(最终)字段
  • 使用局部变量而不是可变字段
  • 了解线索不安全的类,例如CalendarSimpleDateFormatMatcher

当然还有许多微妙的问题,并且有许多资源需要学习(例如Brian Goetz的Java Concurrency in Practice)。

P.S。来自最初的Apache Struts文档的Action Class Design Guidelines