我有一个使用 StreamingAMF 通道连接到 BlazeDS 服务器的 Flex 应用程序。如果浏览器关闭,我想在服务器端进行检测。我为 FlexClientListener 添加了一个实现并将其注册到 FlexClient (FlexContext.getFlexClient().addClientDestroyedListener)
但是在浏览器关闭时不会调用 Listener 的 clientDestroyed 方法。它在会话超时时被调用。有没有其他方法可以实现这一目标?
我有一个使用 StreamingAMF 通道连接到 BlazeDS 服务器的 Flex 应用程序。如果浏览器关闭,我想在服务器端进行检测。我为 FlexClientListener 添加了一个实现并将其注册到 FlexClient (FlexContext.getFlexClient().addClientDestroyedListener)
但是在浏览器关闭时不会调用 Listener 的 clientDestroyed 方法。它在会话超时时被调用。有没有其他方法可以实现这一目标?
我们也有类似的问题,不关闭会话导致 BlazeDS 中的内存泄漏,我们在 swf wrapper javascript 中编写了以下脚本,以确保关闭浏览器调用 flex 中的会话关闭代码
<script language="JavaScript" type="text/javascript">
function cleanup()
{
getMyApplication("swf_filename_without_extension").cleanUp();
alert("Disconnected! Press OK to continue.");
}
function getMyApplication(appName)
{
if (navigator.appName.indexOf ("Microsoft") != -1)
{
return window[appName];
}
else
{
return document[appName];
}
}
</script>
<body onbeforeunload="cleanup()">
在 Flex 中添加一个回调创建完成监听器
ExternalInterface.addCallback("cleanUp",cleanUp);
并在 cleanUp 方法中编写所有会话关闭代码。
注意:不要忘记将警报消息放在 javascript 中。这将为 cleanUp 方法执行提供足够的时间。
您将无法从服务器检测客户端上的浏览器交互。
您最好的猜测是使用ExternalInterface。它允许您的 Flash 应用程序与 JavaScript 通信,反之亦然。
使用JavaScript onClose 事件触发一些 JavaScript,该 JavaScript 将调用您的 Flash 应用程序中的一个函数,该函数将进行远程调用,让您的服务器端知道浏览器正在关闭。