在BlazeDS中优雅地处理服务器超时

时间:2008-11-11 17:47:57

标签: flex blazeds

我有一个Flex客户端,它对运行BlazeDS的tomcat服务器进行服务调用。我想在这种环境中优雅地处理服务器会话超时。

我对服务有安全限制,因此客户端通过基于目标初始化ChannelSet,然后使用该ChannelSet登录来对远程对象进行身份验证。

用户通过身份验证后,如果他们获得一杯(长)咖啡,他们的会话将不可避免地超时。

我希望客户端检测超时,并将用户返回到登录页面,并附上相应的信息性消息。

但是我很难找到从客户端检测此超时的最佳方法。是否有可能,或者我必须让服务器在发生超时时抛出错误?

谢谢!

8 个答案:

答案 0 :(得分:1)

我们为客户端编写了一个自定义组件,用于捕获击键和鼠标事件,然后在客户端上处理超时。

答案 1 :(得分:1)

我们实施了一个自定义UI服务,不断地对服务器进行ping操作(每10分钟1次ping),从而阻止AppServer关闭连接。我们还运行一些内部UI计时器,每次发出任何请求时都会被删除(“ping”除外),其中一个完整的函数调用UI切换回登录并显示“由于客户端不活动而导致会话过期”。

答案 2 :(得分:1)

这不是特定于BlazeDS,但是从Flex 4.5(可能更早)开始,在故障事件中有超时错误的特定故障代码:

在你的错误处理程序中:

if(faultEvent.fault.faultCode == "Client.Error.RequestTimeout"){
  trace("TIMEOUT ERROR");
}

答案 3 :(得分:0)

查看文档,查看连接断开时是否触发了事件。我会想象有。如果没有,请在连接周围使用try / catch并捕获任何与连接相关的问题。如果您这样做,请重定向您的应用并通知用户。您可能需要使用它来查找针对连接问题引发的确切错误代码,但在调试时应该相当容易。

答案 4 :(得分:0)

我在项目中遇到了这个问题,特别是因为BlazeDS的会话超时与实际应用程序不同(通过ClearTrust使用单点登录)。请注意,这是在JBoss环境中。我最后采用一种相当简单的方法,在故障处理程序中查找2个特定的faultCodes(有一个带有常见故障处理程序的基类):DuplicateSessionDetected和DeliveryInDoubt。每当BlazeDS尝试为同一JBoss会话ID创建新会话时,我都会看到DuplicateSessionDetected。 DeliveryInDoubt有时也会出现,但我不确定为什么。当我看到这些故障代码时,我接着采取了必要的操作来刷新应用程序(根据您的需要,您可以重定向到登录页面或其他内容)。显然,根据环境的不同,您可能需要监听不同的故障代码,并且这种方法可能无法在给定不同环境/配置/等的每种情况下都有效。

讨论的另一种方法是在Flex应用程序中使用一个代表BlazeDS超时计时器的计时器,但我并不喜欢让计时器为此目的坐着。我还听说过向服务器来回发送一小段数据以检查是否超时,但同样,这似乎不太理想。

答案 5 :(得分:0)

我在其中一个项目中遇到过这个问题。我要做的就是每当客户端访问服务器时,无论是通过RemoteObject还是HTTPService,它都会首先检查用户的身份验证,如果已经超时,它将返回一些东西,如果罚款,它将继续其进程。在客户端的响应处理程序结果事件中,客户端检查响应是否为超时,如果是,则它将再次转发到登录页面。 据我所知,当用户的会话超时时,服务器无法向客户端抛出错误。您将在下次访问服务器时知道会话超时。

答案 6 :(得分:0)

在服务器端实现FlexSessionListener接口。它提供了一种在实际完成之前处理Flex会话创建/销毁的方法。

在sessionDestroyed处理程序上,使用消息传递生产者将消息从服​​务器发送到客户端,让他知道会话即将超时。

答案 7 :(得分:0)

扩展CallResponder,并覆盖故障方法。

检查data.fault.faultCode是否存在已知错误代码,例如ErrorMessage.MESSAGE_DELIVERY_IN_DOUBT。

如果您获得了匹配,请使用本机函数navigateToURL进行重定向。