我有一个Flex应用程序,它使用StreamingAMF通道连接到BlazeDS服务器。我想在服务器端检测,以防浏览器关闭。我添加了FlexClientListener&将其注册到FlexClient(FlexContext.getFlexClient().addClientDestroyedListener)
但是Listener的clientDestroyed方法不会在浏览器关闭时调用。它在会话超时时被调用。还有其他方法可以做到这一点吗?
您将无法从服务器检测到客户端上的浏览器交互。
您的最佳猜测是使用ExternalInterface。它允许您的Flash应用程序与JavaScript进行通信,反之亦然。
使用JavaScript onClose事件触发一些JavaScript,这些JavaScript将调用Flash应用程序中的一个函数,该函数将进行远程调用,让您的服务器端知道浏览器正在关闭。
我们也遇到了类似的问题,没有关闭会话导致BlazeDS中的内存泄漏,我们用swf包装器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方法的执行提供足够的时间。