首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LCDS & Flex -防止注销后的DuplicateHTTPSession错误

LCDS & Flex -防止注销后的DuplicateHTTPSession错误
EN

Stack Overflow用户
提问于 2011-11-18 05:30:05
回答 3查看 2.8K关注 0票数 5

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

下面是堆栈的重要事实:

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

这是我目前关于是什么引起这个问题的理论:

  • Tab1 (T1)启动客户端->发布的ClientId1 (C1) -> JSession1 (J1)创建
  • Tab2 (T2)启动客户端->发布的ClientId2 (C2) -> Joins J1
  • T1日志在-> J1中不受影响
  • T2日志在-> J1中不受影响
  • T1和T2都订阅,开始在amflongpolling上进行轮询
  • T1发送注销-> J1无效的-> J2
  • T2发送投票(反对J1)
  • T1注销完成,返回J2,更新cookie

最后两个调用会产生冲突,LCDS会看到FlexClient似乎与2 JSessions相关。

因此,会收到以下方面的错误:

Server.Processing.DuplicateSessionDetected检测到基于HTTP的重复FlexSessions,这通常是由于远程主机禁用会话cookie造成的.必须启用会话cookie才能正确管理客户端连接。

注意:我在一个独立的项目中重新创建了这个问题,我相信这不是我们的应用程序特定代码的问题,而是由状态/会话性质和共享同一个会话的多个选项卡之间的冲突引起的。

总之,我认为在服务器上会话由于来自一个选项卡的调用而失效,但在将响应发送到浏览器通知它新的JSession之前,会在旧的Jsession下发出调用。

对于这个重复的会话问题,有哪些适当的策略来防范?

更新

为了澄清,虽然场景类似于讨论过的这里,但存在细微的差异,这使得本文中的解决方案不合适。

具体来说,本文讨论通过使用JSP或编排的调用控制两个浏览器之间的JSessions初始创建来防止重复会话。

Flex实际上通过阻止出站RemoteObject调用来帮助这个过程,直到定义了本地FlexClient DSid变量,显示初始会话已经建立。

我的场景不同,因为JSession (&关联的LCDS FlexSession /客户端FlexClient对象)已经建立了一次(使用了本文中讨论的技术),随后通过注销(这称为session.invalidate() )失效了JSession。

当Tab2发送带有过时JSession (重复的HTTP会话错误)的调用时,就会出现此问题。这种情况变得更加复杂,因为当LCDS抛出DuplicateHTTPSession错误时,它还会使与客户端附加的所有已知的JSession无效,这意味着Tab1 --以前还好--现在有了一个陈旧的JSession。下一次Tab1发送调用时,IT会导致DuplicateHTTPSession错误,循环会重复。

不幸的是,Flex框架挂钩用于在建立sesssions时延迟调用,在设置之后没有一种简单的方法(我已经发现)被重新启用。(我尝试了以下几点,但没有结果:)

代码语言:javascript
复制
 // 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.
   }
EN

回答 3

Stack Overflow用户

发布于 2011-11-22 23:50:05

我很同情你--我和这个问题斗争了很长时间,但一直没有找到解决办法,但我找到了一个对我有用的修复,所以希望它至少能控制住这个问题,直到你找到罪魁祸首。(如果你这样做了,请在这里张贴)。

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

我也尝试了整个"FlexClient.getInstance().id = null;“的方法,但是它本身并没有工作,但是是how和,实现了它。

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

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

代码语言:javascript
复制
// Not sure if this is needed anymore, but I'm leaving it in
FlexClient.getInstance().id = null;

接下来,在我的第一次调用服务器的中,我优雅地处理了故障,并再次清除了那个发臭的ID:

代码语言:javascript
复制
    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);
                }
        });

    }

而且起作用了。

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

关键是,我认为在您至少对服务器进行一次调用之前,清除ID是行不通的。一旦你做到了,它对我来说就像一种魅力,在中,我所有的应用程序都是。

请注意,我使用的是上述SWIZ框架,所以只需将其转换到您自己的世界即可。

顺便说一句,除了IE之外,我从未在任何其他浏览器中见过这个错误,我相信这可能与IE所遭受的臭名昭著的死标签问题有关。

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

祝你好运我的朋友!

票数 1
EN

Stack Overflow用户

发布于 2011-11-21 18:25:37

这篇题为“避免LCDS中检测到的重复会话错误”的文章深入解释了在您的情况下发生了什么.以下是一段相关的引语:

...LCDS认为,它接收到的请求的FlexClient已经与服务器上的不同会话相关联。为了使客户端应用程序确保应用程序中的FlexClients不会陷入这种糟糕的状态,客户端应用程序必须确保在多个FlexClients同时连接到服务器之前已经在服务器上建立了会话。

建议采取几种方法来解决这一问题,包括:

  • 调用jsp页面来加载应用程序 "The jsp page could both create a session for the client application and return an html wrapper to the client which would load the swf."
  • 调用远程处理目标 "which would automatically create a session for the client application on the server"
票数 0
EN

Stack Overflow用户

发布于 2014-09-02 13:51:04

额外的,不相关的,引起注意的;

一些浏览器(例如,Internet)将域命名规则应用于cookie,这意味着像"my_clientX.server.com“这样的代码域虽然可能返回有效的BlazeDS响应,但随着对cookie的访问将被阻止,它将继续触发重复的会话通知。

将名称更改为有效名称(不带下划线)将解决此问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8178179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档