LCDS&Flex – 注销后防止DuplicateHTTPSession错误
我有一个flex / LCDS堆栈,我发现在注销后,我经常(但不总是)开始在客户端上接收重复的HTTP会话错误.
这是堆栈的重要事实: > Flex客户端在应用程序中具有登录/注销功能.注销后页面不刷新. (因此,Flex应用程序和基础mx.messaging.FlexClient仍保持初始化状态) 以下是我目前关于导致问题的理论: > Tab1(T1)启动客户端 – >已发布ClientId1(C1) – > JSession1(J1)创建 最后两个调用产生冲突,LCDS看到FlexClient似乎与2个JSession相关. 结果,收到了以下错误:
注意:我已经能够在独立项目中重新创建问题.我认为这不是我们的应用程序特定代码的问题,而是由状态/会话性质以及共享同一会话的多个选项卡之间的冲突引起的. 总之,我认为问题是由于来自一个选项卡的调用导致服务器上的会话无效,但是在将响应发送到浏览器以通知新的JSession之前,调用是在旧的Jsession下发出的. . 什么是适当的策略来抵御这个重复的会话问题? 更新 为了澄清,尽管该场景类似于here讨论的那些场景,但存在微妙的差异,这使得该文章中的解决方案不合适. 具体来说,本文讨论了通过使用JSP或协调的RemoteObject调用控制跨两个浏览器的JSession的初始创建来防止重复会话. Flex实际上通过阻止出站RemoteObject调用来协助此过程,直到定义了本地FlexClient DSid变量,表明初始会话已建立. 我的场景不同,因为JSession(和相关的LCDS FlexSession /客户端FlexClient对象)已经建立一次(使用该文章中讨论的技术)并随后通过注销失效 – 调用session.invalidate() – 销毁JSession. 当Tab2使用陈旧的JSession发送调用时,会出现问题,这是一个重复的HTTP会话错误.然后情况变得复杂,因为当LCDS抛出DuplicateHTTPSession错误时,它也使与客户端连接的所有已知Jsessions无效,这意味着Tab1 – 一直没问题 – 现在有一个陈旧的JSession. Tab1下次发送呼叫时,IT会导致DuplicateHTTPSession错误,并且循环重复. 不幸的是,Flex框架挂钩用于在建立sesssions时延迟调用没有简单的方法(我发现)一旦设置就重新启用. (我试过以下,无济于事:) // 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); } }); } 它奏效了. 基本上,尝试调用,如果重复会话事件失败,则清除该ID并重新发出调用. 关键是我不认为在您至少拨打一次服务器之前清除ID.一旦你这样做,它对我和我的所有应用程序都像一个CHARM. 请注意,我正在使用上面的SWIZ框架,因此只需将其转换为您自己的世界. 顺便说一下,除了IE之外,我从未在任何其他浏览器中看到过这个错误,我相信它可能与IE遭受的臭名昭着的Dead Tab问题有关. 如果上述方法不起作用,我也知道服务器上某些配置文件可能会有所帮助. 祝你好运,我的朋友! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |