【问题标题】:How do I access cookies within Flash?如何在 Flash 中访问 c​​ookie?
【发布时间】:2010-09-11 16:41:06
【问题描述】:

我希望在 Flash 电影中获取同一域的 cookie 值。这可能吗?

让我们看看我让用户设置一个变量 foo 并使用任何 Web 编程语言存储它。我可以通过该语言轻松访问它,但我想通过 Flash 电影访问它,而不是通过在 HTML 页面中打印来传递它。

【问题讨论】:

    标签: flash actionscript cookies


    【解决方案1】:

    如果您只想存储和检索数据,您可能希望使用 SharedObject 类。有关详细信息,请参阅Adobe's SharedObject reference

    如果您想访问 HTTP cookie,您需要使用 ExternalInterface 与 javascript 对话。我们在这里的做法是创建一个名为 HTTPCookies 的帮助器类。

    HTTPCookies.as:

    import flash.external.ExternalInterface;
    
    public class HTTPCookies
    {
        public static function getCookie(key:String):*
        {
            return ExternalInterface.call("getCookie", key);
        }
    
        public static function setCookie(key:String, val:*):void
        {
            ExternalInterface.call("setCookie", key, val);
        }
    }
    

    您需要确保使用 Flash 对象中的“allowScriptAccess”参数启用 javascript。

    然后你需要创建一对javascript函数getCookie和setCookie,如下(感谢quirksmode.org

    HTTPCookies.js:

    function getCookie(key)
    {
        var cookieValue = null;
    
        if (key)
        {
            var cookieSearch = key + "=";
    
            if (document.cookie)
            {
                var cookieArray = document.cookie.split(";");
                for (var i = 0; i < cookieArray.length; i++)
                {
                    var cookieString = cookieArray[i];
    
                    // skip past leading spaces
                    while (cookieString.charAt(0) == ' ')
                    {
                        cookieString = cookieString.substr(1);
                    }
    
                    // extract the actual value
                    if (cookieString.indexOf(cookieSearch) == 0)
                    {
                        cookieValue = cookieString.substr(cookieSearch.length);
                    }
                }
            }
        }
    
        return cookieValue;
    }
    
    function setCookie(key, val)
    {
        if (key)
        {
            var date = new Date();
    
            if (val != null)
            {
                // expires in one year
                date.setTime(date.getTime() + (365*24*60*60*1000));
                document.cookie = key + "=" + val + "; expires=" + date.toGMTString();
            }
            else
            {
                // expires yesterday
                date.setTime(date.getTime() - (24*60*60*1000));
                document.cookie = key + "=; expires=" + date.toGMTString();
            }
        }
    }
    

    在您的 Flash 项目中拥有 HTTPCookies.as 并从您的网页加载 HTTPCookies.js 后,您应该能够从 Flash 电影中调用 getCookie 和 setCookie 来获取或设置 HTTP cookie。

    这仅适用于非常简单的值 - 字符串或数字 - 但对于更复杂的值,您确实应该使用 SharedObject。

    【讨论】:

    • flash代码究竟是如何获取js getCookie()调用的返回值的呢?您的 AS 代码中没有 return 语句。它应该只返回 ExternalInterface 调用的结果吗?
    【解决方案2】:

    我相信 Flash 对象具有可通过 javascript 访问的功能,因此如果没有更简单的方法,您至少可以使用 javascript onload 处理程序并将 document.cookie 从外部传递到您的 Flash 应用程序。

    更多信息在这里:http://www.permadi.com/tutorial/flashjscommand/

    【讨论】:

      【解决方案3】:

      您可以从闪存读取和写入 cookie(本地共享对象)。 Flash cookie 存储在您的 PC 上以您的域名称命名的目录中。这些目录位于:

      [Root drive]:\Documents and Settings\[username]\Application Data\Macromedia\Flash Player\#SharedObjects\
      

      这个来自 Adob​​e 的 article 是一个好的开始。

      【讨论】:

      • 请注意,共享对象不是 cookie,它们的工作方式大致相同,但 SharedObjects 是特定于 Flash 的。
      【解决方案4】:

      一些谷歌搜索表明可以使用query strings 来完成:

      对于网络应用,你可以通过 通过 url 参数将值转换为 swf,以及 (带有 swf 内的动作脚本)保存 将它们放到沙盒中。

      【讨论】:

        【解决方案5】:

        cookie 可通过 document.cookie 用于 javascript - 尝试使用 flash 的 getURL 调用 javascript 函数。

        getURL('javascript:document.cookie = "varname=varvalue; expires=Thu, 2 Aug 2001 20:47:11 UTC; path="');

        【讨论】:

          【解决方案6】:

          HTTPCookies.as 中的getCookie 方法应使用“return”语句。

          import flash.external.ExternalInterface;
          public class HTTPCookies
          {    
            public static function getCookie(key:String):*   
            {
                  return ExternalInterface.call("getCookie", key);    
            }
            public static function setCookie(key:String, val:*):void 
            {
                  ExternalInterface.call("setCookie", key, val);    
            }
          }
          

          【讨论】:

            【解决方案7】:

            我晚了 10 年。如果你可以在页面中嵌入你需要的数据,那么抓取起来会容易 10 倍。

            import flash.net.*
            
            var _loader:URLLoader = new URLLoader();
            var _req:URLRequest = new URLRequest('https://stackoverflow.com');
            _loader.addEventListener(Event.COMPLETE, _onComplete);
            _loader.load(_req);
            
            function _onComplete(e:Event):void{
                var wantedData:RegExp = /<div class="cool-data">(.*?)</div>/ig;
                var result:Object = wantedData.exec(String(_loader.data));
                trace(result[0].split('<div class="cool-data">').join('')
                               .split('</div>').join(''));
            
            }
            

            【讨论】:

              猜你喜欢
              • 2012-06-13
              • 2014-09-27
              • 1970-01-01
              • 2013-01-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-26
              相关资源
              最近更新 更多