如何在 Flash 中访问 c​​ookie?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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://***.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(''));


【讨论】:

以上是关于如何在 Flash 中访问 c​​ookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flash CS3 中访问组成员

如何在 Flash 中为 MovieClip 分配属性并在 Flex 中访问它们?

Action Script 3. 如何在 Flash 中访问 Movie Clip 中的按钮?

用flash as3语言如何将影片剪辑存入一个数组以及如何访问?

Trello 如何访问用户的剪贴板?

JSFL:如何在 Adob​​e Flash CS5 中访问 Motion Tween 关键帧?