apache-flex - LCDS & Flex - 注销后防止 DuplicateHTTPSession 错误

标签 apache-flex blazeds lcds

我有一个 flex/LCDS 堆栈,我发现在注销后,我经常(但不总是)开始接收 Duplicate HTTP Session客户端上的错误。

以下是堆栈的重要事实:

  • flex 客户端在应用程序中具有登录/注销功能。注销后页面不刷新。 (因此,Flex 应用程序和底层 mx.messaging.FlexClient 保持初始化状态)
  • 一个用户可以打开多个选项卡。
  • per-client-authentication设置为 false - 我们正在尝试实现 SSO(与 CAS 集成),因此用户原则绑定(bind)到 JSession。
  • 当使用长轮询进行消息传递以及打开两个(或更多)选项卡时,问题最为明显。
  • 使用 RTMP 或 Streaming channel 时,问题很难重现。
  • 用户绑定(bind)到 JSession - 即,如果他们在 Tab1 上登录,他们将在 Tab2 上登录。
  • 当用户从任一选项卡注销时,Jsession 将失效。

  • 这是我目前关于导致问题的原因的理论:
  • Tab1 (T1) 启动客户端 -> 发布 ClientId1 (C1) -> JSession1 (J1) 创建
  • Tab2 (T2) 启动客户端 -> 发布 ClientId2 (C2) -> 加入 J1
  • T1 登录 -> J1 不受影响
  • T2 登录 -> J1 不受影响
  • T1 & T2 都订阅了,开始轮询 amflongpolling
  • T1 发送注销 -> J1 无效 -> J2 已创建
  • T2 发送轮询(针对 J1)
  • T1 注销完成,返回 J2,更新 cookie

  • 最后两个调用产生冲突,其中 LCDS 看到 FlexClient似乎与 2 个 JSessions 有关。

    结果,收到了以下内容的错误:

    Server.Processing.DuplicateSessionDetected Detected duplicate HTTP-based FlexSessions, generally due to the remote host disabling session cookies. Session cookies must be enabled to manage the client connection correctly.



    注意:我已经能够在独立项目中重现该问题。 我相信这不是我们的应用程序特定代码的问题,而是由状态/ session 性质以及共享同一 session 的多个选项卡之间的冲突引起的。

    总之,我认为问题是由于来自一个选项卡的调用而导致服务器上的 session 无效,但是在将响应发送到浏览器以通知它新的 JSession 之前,调用是在旧的 JSession 下发出的.

    有哪些适当的策略可以防止这种重复的 session 问题?

    更新

    澄清一下,虽然场景与讨论的场景相似 here ,有细微的差异使该文章中的解决方案不合适。

    具体来说,本文讨论了通过控制 来防止重复 session 。初始创建使用 JSP 或编排的 RemoteObject 调用跨两种浏览器的 JSession。

    Flex 实际上通过在本地 FlexClient DSid 之前阻止出站 RemoteObject 调用来协助此过程。变量被定义,表明初始 session 已经建立。

    我的情况有所不同,因为 JSession(和相关联的 LCDS FlexSession/客户端 FlexClient 对象)已经建立一次(使用该文章中讨论的技术),随后通过注销而失效 - 这调用了 session.invalidate() - 破坏 JSession。

    当 Tab2 发送带有陈旧 JSession 的调用(重复的 HTTP session 错误)时,就会出现问题。然后情况变得复杂,因为当 LCDS 抛出 DuplicateHTTPSession 错误时,它也会使与客户端连接的所有已知 Jsession 无效,这意味着 Tab1 - 本来没问题 - 现在有一个陈旧的 JSession。下次 Tab1 发送调用时,IT 会导致 DuplicateHTTPSession 错误,并且循环重复。

    不幸的是,用于在 session 建立时延迟调用的 Flex 框架钩子(Hook)没有简单的方法(我发现)一旦设置就重新启用。 (我尝试了以下方法,但无济于事:)
     // Reset DSid to get a new FlexSession established on LCDS
       use namespace mx_internal
    
       public function resetFlexSession()
       {
            FlexClient.getInstance().id = null;  
            // Note - using FlexClient.NULL_ID also doesn't work.
       }
    

    最佳答案

    我同情你 - 我已经为此奋斗了很长时间,但从未找到解决方案,但找到了解决方法 对我有用所以希望它至少可以控制这个问题,直到你找到罪魁祸首。 (如果你这样做了,请把它贴在这里)。

    现在,我的环境与您略有不同(我在后端使用 CF),所以请记住这一点。

    我还尝试了整个“FlexClient.getInstance().id = null;”事情也是如此,它本身不起作用,但它是 怎么样哪里我实现了它,使它工作。

    所以,这就是我所做的,使问题消失了。

    在我的主表单上,在任何之前 进行了 RemoteServer 调用,我设置了一个 creationComplete 处理程序并放置了您已经知道和喜欢的代码:

    // Not sure if this is needed anymore, but I'm leaving it in
    FlexClient.getInstance().id = null;
    

    接下来,在我的 第一个电话到服务器,我优雅地处理故障,并再次清除那个臭ID:
        public function login(event:Event): void {
    
            Swiz.executeServiceCall(roUsers.login(),
                function (event:ResultEvent): void {
                    // Handle a successful login here...
                }
                , function (faultevent:FaultEvent): void {
                    // This code fixes this issue with IE tabs dying and leaving Flex with a Duplicate Session problem.
                    if (faultevent.fault.faultString.indexOf("duplicate")) {
                      FlexClient.getInstance().id = null;
                      Swiz.dispatchEvent(event);
                    }
            });
    
        }
    

    它奏效了。

    基本上,尝试调用,如果重复 session 失败,则清除该 ID 并重新发出调用。

    关键是我认为在您至少向服务器发出一次调用之前清除 ID 不会起作用 .一旦你这样做了,它对我来说就像一个魅力,在 全部 我的应用程序。

    请注意,我使用的是上面的 SWIZ 框架,因此只需将其转换为您自己的世界即可。

    顺便说一句,除了 IE,我从未在任何其他浏览器中看到过这个错误,我相信它可能与 IE 遭受的臭名昭著的 Dead Tab 问题有关。

    如果上述方法不起作用,我还知道对服务器上的某些配置文件进行的一些更改可能会有所帮助。

    祝你好运,我的 friend !

    关于apache-flex - LCDS & Flex - 注销后防止 DuplicateHTTPSession 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8178179/

    相关文章:

    c# - 调试 AxShockwaveFlash

    java - 将 arrayCollection 从 flex 传递到 java

    java - 在 JSON 中传递数组集合

    apache-flex - 如何在flex textarea中使文本换行

    apache-flex - Spring MVC 和 Flex 通过 BlazeDS 集成?

    java - 高级 LCDS 主题的资源?

    java - 映射 Java ArrayList<CustomClass> 和 Flex ArrayCollection

    java - 在 Flex 应用程序中更改值时实时传播 DataGrid/ArrayCollection

    ruby-on-rails - 从 Ruby on Rails 应用程序将数据传递到 Flex 图表的最佳方法是什么?

    java - 如何处理M :M entity relationships in Flex/Java web application?