AIR:安全沙箱使用远程图像时发生冲突

时间:2009-09-08 16:25:00

标签: flex security air

以下代码简化为例如

我正在开发一个AIR应用程序(使用Flex),它从远程Web服务器加载它的几个图像。图像显示正常,但是,每当我操作容纳远程加载图像的容器时,我的控制台出错:

*** Security Sandbox Violation ***
SecurityDomain 'http://www.google.com/intl/en_ALL/images/logo.gif' tried to access incompatible context 'app:/sandbox_test.swf'

图像似乎没有受到影响,但我不喜欢显示我不理解的错误。这是一个示例问题的示例应用程序:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication width="500" height="500" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:HDividedBox width="100%" height="300" horizontalCenter="0" verticalCenter="0" backgroundColor="#000000" liveDragging="true">
        <mx:Image source="http://sstatic.net/so/img/logo.png"/>
        <mx:Image source="http://www.google.com/intl/en_ALL/images/logo.gif"/>
    </mx:HDividedBox>
</mx:WindowedApplication>

如果使用HDividedBox上的拖动器进行拖动,则会出现安全错误。

我已经查看了AIR的一些安全类/安全沙箱内容,但默认情况下,AIR应该可以访问网络资源(这就是我认为图像加载的原因)。在AIR中使用Security.allowDomain(“www.google.com”)不是一个选项 - 它只会引发SecurityError。

有谁知道是什么导致了它,或者如何修复它? (或者它可能只是一个Flex / AIR错误?)。

此外 - 有没有人知道在发生错误时是否有办法打破,所以我可以将其追踪到引起它的根行动?

3 个答案:

答案 0 :(得分:3)

此安全沙箱问题特定于拖动其中包含Image组件的UIComponents。图像组件引用外部图像。我到处寻找,我遇到的所有帖子都没有得到答复,这通常意味着它是一个错误。

我的盗版解决方法?将图像下载到Image组件后,将其缓存为位图并将Image组件源重新分配给Bitmap。这为我解决了这个问题:

private function authorImageLoadComplete(event:Event):void {
    var bp:Bitmap = dupeImage(authorImage);
    authorImage.source=bp;

}

private function dupeImage(source:Image):Bitmap {
    var data:BitmapData = Bitmap(source.content).bitmapData;
    var bitmap:Bitmap = new Bitmap(data);
    return bitmap;
}

然后是你的UIComponent中的图像标记:

<mx:Image id="authorImage" complete="authorImageLoadComplete(event)"></mx:Image>

祝你好运

答案 1 :(得分:1)

对于Flex 4,请尝试将顶级 WindowedApplication useNativeDragManager 属性设置为false,如下所示:http://cookbooks.adobe.com/post_How_do_you_make_a_Spark_custom_itemRenderer_with_a-16532.html

答案 2 :(得分:0)

当您未在Debug中运行时,是否会显示此图像?问题是该域没有设置crossdomain.xml文件以允许Flash中的图像。

http://www.google.com/crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <site-control permitted-cross-domain-policies="by-content-type" />
</cross-domain-policy>

您应该只是抓取图像并将它们放在应用程序的资产中,或者放在您控制的域上,并且可以正确添加允许内容的crossdomain.xml。 Security.allowDomain不会产生您正在寻找的影响。 This article对我读过的跨域安全性有最好的解释。

请参阅下面的ryanstewart的评论。以上是AIR应用程序的hogwash。