代码之家  ›  专栏  ›  技术社区  ›  futureelite7 Adam Rosenfield

确保只有一个SWF实例打开?

  •  2
  • futureelite7 Adam Rosenfield  · 技术社区  · 16 年前

    我需要确保一台计算机上一次只能打开一个SWF实例,无论它是在两个浏览器窗口中,还是在两个不同的浏览器中。

    我该怎么做呢?

    到目前为止,我已经想到了两个潜在的解决方案:

    1)使用flash sharedobject-但由于它们永不过期,如果用户关闭浏览器窗口而不调用我的退出功能删除它,则剩余的对象将干扰其他新会话。(可能是用来标识实例的随机数字和时间戳?)

    2)使用localconnection——有点黑客,这依赖于swf检测是否正在使用localconnection对象,如果是这样,则不加载。但是,只要有一点点挑衅,本地连接就会崩溃,所以我有点担心使用它。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Hrundik    14 年前

    我相信localconnection有一个关于sharedObject的Advagatage解决方案——它允许全局范围的localconnection名称,尽管据我所知,本地sharedObject总是存储在每个域中。

    对于sharedObject,唯一的选择是在其中保持定期更新的时间戳,并在每次运行.swf时检查它。

    所以我会选择一个简单的基于本地连接的解决方案,因为它非常简单,而且我从未遇到过任何本地连接问题。

    public class LCTest extends Sprite
    {
        public function LCTest()
        {
            var lc:LocalConnection = new LocalConnection();
            lc.allowDomain("*");
            try
            {
                lc.connect("_myLCLock"); // underscore for global scope
                trace('not running, can init');
            }
            catch (e:ArgumentError)
            {
                trace('already running');
            }
        }
    }
    
        2
  •  1
  •   fenomas    16 年前

    如果SWF只在一个位置可用,我认为共享对象是一个安全的赌注。我不认为有必要担心复杂的会话,应该有一个关闭事件,即使是在手动关闭浏览器的情况下也可以捕获。(即使没有,我也有99%的人确信SOS在关机时会被刷新,所以应该可以采取一些解决方法。)

    但是,共享对象本质上与SWF的位置相关联,因此用户可以通过查看在本地保存的SWF的第二个副本,或上传到其他Web服务器,或其他方式,避开上述方法。如果这是一个担心,如果SWF仍然在这种情况下工作,那么我认为本地连接是您唯一的选择。但我从来没有发现信用证是非常可靠的。我不知道它是否能防弹,但我认为这是唯一的选择。

        3
  •  0
  •   K2xL    14 年前