代码之家  ›  专栏  ›  技术社区  ›  Tiago

javascript桥接到flash,以便在flash中存储“cookies”

  •  2
  • Tiago  · 技术社区  · 17 年前

    在阅读了这个问题之后 How do I uniquely identify computers visiting my web site? :

    一种可能是使用flash cookies:

    Ubiquitous availability (95 percent of visitors will probably have
    

    闪光灯)

    You can store more data per cookie (up to 100 KB)
    
    Shared across browsers, so more likely to uniquely identify a machine
    
    Clearing the browser cookies does not remove the flash cookies.
    

    你需要建造一个小的(隐藏的) 快闪电影读写。

    我试图找出是否有人已经做过这样的事情,所以我不必重新发明轮子。到目前为止,除了 code in the flash side

    我在这方面的用途是防止用户多次回答一个小测验,但将来可能会使用禁止巨魔。

    有没有人知道一个开源库可以做到这一点,并允许我通过javascript访问?

    注意:我不知道flash,我也没有执照。

    编辑:可以使用 evercookie . 这是一种邪恶,但有效。

    5 回复  |  直到 10 年前
        1
  •  1
  •   ForYourOwnGood    17 年前

    以什么为基础 拉梅多 说,为了帮助你开始,你需要知道如何在flex3 api中使用两个类, SharedObject 和 ExternalInterface .

    共享对象 将允许您存储和检索来自客户端计算机的数据,以及 外部接口 将允许您的actionscript与您的javascript通信。

    使用共享对象很简单。

    要将数据放到用户机器上,只需创建一个sharedObject并向sharedObject的数据属性添加属性。

      private var sharedObject : SharedObject = SharedObject.getLocal("myCookie");
      sharedObject.data.DATA_FOR_THE_COOKIE = DATA;
    

    从sharedObject中检索数据同样简单。确保sharedObject的大小大于0(确保sharedObject存在),并通过sharedObject的数据属性查找属性名称。

    if(sharedObject.size > 0)
           // access data from cookie with -> sharedObject.data.DATA_FROM_THE_COOKIE;
    

    要将sharedObject中存储的数据传递给javascript,需要使用externalInterface。

    假设您有一个javascript函数来检索变量

    function retrieveVars( vars ){
       // Do something with vars.
    }
    

    要从ActionScript调用此函数,将使用

    ExternalInterface.call("retrieveVars", DATA_ITEM_1, DATA_ITEM_2, ...);
    

    就这么简单。

    请注意,如果客户端的Flash播放器的存储设置为0,或者客户端的浏览器没有ActiveX或NPruntime,则此技术将不起作用。

        2
  •  1
  •   rmeador    17 年前

    我犹豫着回答你的问题,因为听起来这是在危险地接近邪恶…而且,它注定要失败。如果你真的想阻止一个用户多次回答一个测验,你能做的最好的事情就是让他们注册一个用户帐户。如果您想阻止他们注册多个用户帐户,您可以让他们通过信用卡或普通邮件来验证某些内容,这两种方法通常都是不可行的解决方案。简而言之,互联网是匿名的。

    无论如何,如果你真的想继续这个计划,你可以用flex(flash的一个变种)构建你的应用程序。Adobe网站上有很多文档。其中一些相当稀疏和烦人,尤其是集合API,但对于您的目的来说,它就足够了。actionscript(flash和flex的底层编程语言)非常类似于javascript,并且易于学习。flex有一个免费的sdk(通常在页面上的一个小链接中提供,该链接告诉您要获得昂贵的flex builder;flex builder主要是一个GUI工具,而您只需要sdk就可以在没有ide的情况下直接编写代码),因此许可证不应该是问题。javascript到flash桥接也有很好的文档记录。

        3
  •  1
  •   Kevin    10 年前

    BakedGoods 似乎正是你需要的(或者更确切地说,是你需要的) 确实需要 );它是一个javascript库,它建立了一个统一的接口,可用于在所有本机和一些非本机存储设施中执行公共存储操作,包括闪存本地共享对象(您所说的“cookie”)。

    有了它,创建一个LSO可以用简单的代码来完成,比如:

    bakedGoods.set({
        data: [{key: "key", value: "value"}],
        storageTypes: ["flash"],
        complete: function(byStorageTypeRemovedItemKeysObj, byStorageTypeErrorObj){/*code*/}
    });
    

    检索和删除数据同样简单。相信我,我会知道的;我是它的维护者:)


    如果出于任何原因,您希望推出自己的解决方案,rmeador和Foryourowngood为您提供了足够的信息,帮助您开始工作。

    但是,他们忘了告诉你如何做一件非常重要的事情: 如何使用javascript访问将处理共享对象的actionscript代码 .

    首先,您需要将ActionScript代码封装到一个方法中,然后将该方法注册为其父应用程序的外部接口的一部分:

    function handleObjects(/*param1, param2, ... */):void {/*code*/}
    ExternalInterface.addCallback("handleObjects");
    

    其次,您需要编译ActionScript应用程序(代码),并在HTML中创建一个引用结果.swf文件的元素。

    然后,假设上述HTML元素表示为一个名为 flashDOMElement ,可以使用domElement调用方法:

    flashDOMElement.handleSharedObjects(/*arg1, arg2, ... */);
    

    就这样!有一些事情我们没有提到或略读过,但总的来说,推出自己的解决方案并不难。推出自己的 可靠的 不过,解决方法是另一回事,这也是我建议您使用bakedgoods的部分原因。

        4
  •  0
  •   Tiago    15 年前

    对于现在正在搜索的人,请务必签出 evercookie .

        5
  •  0
  •   Nathan Friedly    14 年前

    Evercookie确实完成了这项工作,但这与您最初的要求有点接近: https://github.com/nfriedly/Javascript-Flash-Cookies 麻省理工学院执照。