【问题标题】:Concurrent HTTP Session is returning wrong user并发 HTTP 会话返回错误的用户
【发布时间】:2013-05-14 12:40:15
【问题描述】:

我遇到了一个非常奇怪的问题。当两个用户同时登录时,其中一个会被检测为另一个。

    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

【问题讨论】:

  • strRemoteUser 是类变量吗?另外,如果您使用的是 JSP,请检查此响应:stackoverflow.com/a/10778311/1083581
  • 是的,它是一个类变量。这是一个好习惯吗?
  • 我们使用的 JSP 只有一个 语句,因此会触发 LoginAction 动作。我粘贴的代码直接放在LoginAction的“execute”方法中。我的 JSP 的标头中已经有 。
  • 如果我们谈论的是同一件事,这些都是经典的并发问题。将变量移动到方法中并再次运行它并查看输出。
  • 那么它解决了您的问题吗?如果是,我可以写我的 cmets 作为答案,您可以将其标记为已接受:) .. 或者我们可以继续调试

标签: java session struts struts-1


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    许多开发人员忽略了这样一个事实,即 Struts 1 使用Action单个实例 来处理来自所有会话的请求,因此Actions 应该以并发安全的方式编写,例如 p>

    • 仅使用不可变(最终)字段
    • 使用局部变量而不是可变字段
    • 注意线程不安全的类,如CalendarSimpleDateFormatMatcher

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

    附: Action Class Design Guidelines 来自原始 Apache Struts 文档

    【讨论】:

    • 感谢您提供更多信息。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多