如何修复此跨域 ActionScript 3 错误?

2023-11-22

我将尽可能具体和详细,并包含一些我正在使用的代码。我已经进行了搜索并发现这个问题,这看起来很相似;然而,作者使用的是 ActionScript 2 而不是 3,我似乎无法有效地将给出的任何答案应用于我自己的情况。

我试图通过 Flash/ActionScript 3 模拟(以有限的方式)JavaScript 的 XMLHttpRequest 对象的行为,以克服同域限制。但我发现 ActionScript 在这方面有其自身的局限性。我承认我可能是错的,但据我了解,理论上仍然可以使用 ActionScript 进行这种跨域脚本编写,只要您获得了正确的所有权限。这就是我遇到麻烦的地方。

首先,我借用了一个名为的类的一些开源代码Ajax请求,我已另存为/ajax/AjaxRequest.as。然后我创建了一个名为的 Flash 文件/jsajax.fla导出到最终的 SWF 文件,/jsajax.swf。现在,下面是包含 Flash 文件的第一个也是唯一一个帧的 ActionScript 代码:

import ajax.AjaxRequest;
Security.allowDomain("domainone.com");
Security.allowDomain("domaintwo.com");

function jsAjax(stringURL:String, stringMethod:String, stringData:String):void
{
    var xhr:AjaxRequest = new AjaxRequest(stringURL);
    xhr.contentType = "application/x-www-form-urlencoded";
    xhr.dataFormat = URLLoaderDataFormat.TEXT;

    if ( stringMethod.toUpperCase() == "POST" ) {
        xhr.method = URLRequestMethod.POST;
    } else {
        xhr.method = URLRequestMethod.GET;
    }

    xhr.addEventListener("complete", jsAjaxResponse);
    xhr.send(stringData);
    return;
}

function jsAjaxResponse(evt:Event):void
{
    ExternalInterface.call("jsAjaxResponse", evt.currentTarget.data.toString());
    return;
}

ExternalInterface.addCallback("jsAjax", jsAjax);
ExternalInterface.call("jsAjaxReady");

到目前为止,一切都很好。我有一种感觉,其中一个或多个Security.allowDomain不需要打电话,但它们是我试图解决这个问题的(不成功的)尝试。

在我的 JavaScript 中,我定义了三个函数:jsAjax, jsAjaxResponse, and jsAjaxReady。最后一个只是一个非常基本的函数,用于指示 Flash 对象加载成功(仅在加载后立即调用一次),而其他两个用于发送和接收数据。正如您所看到的,它们有相应的 ActionScript 对应项。

最后,我创建了一个简单的 HTML 页面,名为/test.html嵌入此 SWF 文件(使用swf对象)并有几个简单的表单控件用于调用jsAjax功能。我所有的 JavaScript 定义也都嵌入到这个 HTML 文件中。我还创建了一个非常简单的 PHP 脚本,名为/test.php打印出内容$_REQUEST大批。这就是我打算使用此 ajax 方法请求的脚本。

我测试了三种场景,但我只能让其中两种工作:


场景一:一切都在一台服务器上
如果我将所有这些文件上传到domainone.com,然后请求test.php,它就可以正常工作。我的文件/文件夹结构如下所示:

domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php

Again, 这有效。 jsAjaxResponse 函数很好地从 test.php 接收回数据。


场景二:在两台服务器上,向左倾斜
当我将 HTML 和 SWF 上传到第一台服务器,然后让它调用第二台服务器上的 PHP 脚本时,它并没有立即工作。我做了一些挖掘,发现通过创建crossdomain.xml授予对domainone.com 访问权限的domaintwo.com 上的文件,这修复了它。所以我的文件/文件夹结构如下所示:

domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml

当在 crossdomain.xml 文件中明确允许 domainone.com 时,这有效。同样,jsAjaxResponse 函数从 test.php 接收回数据就好了。


场景三:在两台服务器上,向右倾斜
当我将除 HTML 之外的所有内容上传到domaintwo.com 时,我无法再让它工作。换句话说,domainone.com 上的 HTML 正在引用 domaintwo.com 上托管的 SWF 文件,并且该 SWF 文件正在尝试向 domaintwo.com 发出请求。我保留了场景 2 中相同的 crossdomain.xml 文件,以防万一。我的文件/文件夹结构如下所示:

domainone.com/test.html
domaintwo.com/jsajax.swf
domaintwo.com/test.php
domaintwo.com/crossdomain.xml

这是我无法开始工作的唯一情况,也是我需要开始工作的情况。前两个实际上只是测试场景,看看脚本是否正常工作。当我尝试在这里运行 jsAjax 函数时,我遇到了一个错误,该错误在 Firebug 中出现了两次:

uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].

帮助!如何让它在场景 3 中工作?


我刚刚想通了!这确实与Security.allowDomain我的 Flash 文件中的命令。我实际上主持的是test.html在domainone.com 的子域上,这让事情变得很糟糕。它必须是完全匹配、子域等等。事实证明我不需要Security.allowDomain引用了domaintwo.com的命令,我也不需要crossdomain.xml文件完全存在于场景 3 中!

由于在我最终使用的此脚本的“真实”版本中,我不一定知道 domainone.com 实际上是什么,因此我将 Flash 文件顶部的代码更改为:

import ajax.AjaxRequest;
try {
    var domain1:String = LoaderInfo(this.root.loaderInfo).parameters["allow"];
    if ( domain1.length > 0 ) {
        Security.allowDomain(domain1);
    }
} catch (error:Error) { }
try {
    var domain2:String = LoaderInfo(this.root.loaderInfo).parameters["allowhttps"];
    if ( domain2.length > 0 ) {
        Security.allowInsecureDomain(domain2);
    }
} catch (error:Error) { }
...

然后,在我用来嵌入 SWF 的 JavaScript 中,我基本上从以下位置获取页面的当前域:document.location.toString(),检查是否使用http或https,然后将域作为allow and/or allowhttps在 flashvars 参数中。可能有一种“更好”的方法来做到这一点,不依赖于在 Flash Vars 中显式设置域(从 Flash 内部进行某种自动检测),但我对 ActionScript 不够熟悉,无法弄清楚这一点出去。由于这个文件已经在 J​​avaScript 和 ActionScript 之间进行了大量的双向通信,所以这并不是什么大不了的事情。这个解决方案对我来说已经足够好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复此跨域 ActionScript 3 错误? 的相关文章

  • Chrome 通知/权限栏 - 检测是否可见

    当 Flash 请求访问相机或麦克风时 Chrome 会显示以下通知栏 有没有 JavaScript 或 AS3 方法可以检测它是否可见 我知道你问这个问题已经很长时间了 但我们终于找到了一个我想分享的解决方法 ActionScript C
  • Chrome 跨域 PATCH 请求不起作用

    我有一个带有 REST Api 的网站 现在我正在创建一个浏览器扩展 它将从某些页面收集数据并将它们发送回 REST Api 因为我希望我的扩展能够与 Firefox 和 Chrome 兼容 并且易于维护 所以我将实际代码作为脚本标记注入到
  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • 使用 Flex 3 从 SWF 创建 EXE,而不需要 AIR?

    我有一个用 Flex 3 MXML 和一些 AS3 编写的简单的小测试应用程序 我可以将其编译为 SWF 但我想将其制作为 EXE 这样我就可以将它提供给我的几个同事 他们可能会发现它有用 使用 Flash 8 我可以只针对 EXE 而不是
  • 为什么 swfloader 不工作?

    我正在尝试使用 mxml swfloader 组件从以下 url 加载外部 Flash 但它不加载任何内容 我正在使用 FlashBuilder 4 5 http somesite com en interface swf token 12
  • 当一个 SWF 动态加载另一个 SWF 文件时,如何使两个 SWF 文件中使用的 Action Script 3 类解析为同一个类?

    背景 我正在纯 Action Script 3 中开发一个高度模块化的应用程序 我们使用 Flex 4 SDK 来自动化构建 但我们所有的代码必须能够直接在 Flash CS4 Professional 中编译 我们有一个 framewor
  • 用于商业 Web 应用程序的 Flash - 为什么不呢?

    我从事开发商业网络应用程序的行业 它们大多供内部使用 有时有合作伙伴区域 但很少可供公共互联网使用 它们是帮助公司运营业务的应用程序 一段时间以来 我有一个想法困扰着我 为什么不使用 Flash 到现在为止都是ASP NET AJAX 这还
  • 不存在“Access-Control-Allow-Origin”,不允许访问 Origin“null” - Passport-SteamStrategy、节点

    我有一个正在使用 Passport Steam 策略的网站 我的服务器 Node with Express 当前在 localhost 3000 上运行 而我的前端在 localhost 8080 上运行 仅在尝试通过 Steam 授权时
  • iOS:适用于 iOS 的基于 Flash 的编程应用程序?

    我想知道 有没有办法支持 iOS 的基于 Flash 的编程应用程序 它可以是本机 混合或网络应用程序 我想知道 是否有可能为 iOS 设备开发基于 Flash 的应用程序 我看过论坛 到处都说这是不可能的 所以只想在开始任何开发之前确认一
  • as3 - 如何停止视频并分离 NetStream

    我有来自服务器的视频流 稍后我想并排添加另一个视频 那就好 我做到了 现在当我想删除视频时我的问题来了 我设法将其从显示中删除 但我可以听到视频仍在后台播放 那么我怎样才能停止播放该视频呢 这是我设置视频的代码 ns new NetStre
  • Flex 4:状态改变事件

    Flex 4 中是否有任何事件可以用来检测状态更改 我知道这个问题已经很老了 但是通过谷歌搜索状态更改事件 我仍然到达这里 所以对于想知道的人 有一个StateChangeEvent CURRENT STATE CHANGE由组件调度的事件
  • 将图像保存在 applicationStorageDirectory 的目录中

    我试图将图像文件保存到我的空气项目的应用程序存储目录中的目录中 首先创建目录 var imageDirectory File File applicationStorageDirectory resolvePath vispics if i
  • 如何为WCF服务添加跨域支持

    我试图允许从托管在 localhost 80 的 javascript 应用程序向托管在不同端口的 WCF RStful 服务发出 POST 请求 但不知何故它不起作用 我尝试将自定义属性添加到标头 以及以编程方式将其添加到我的服务中JSO
  • 将两个声音文件合并为一个新文件

    如何合并两个声音并另存为新文件 一种声音是加载的 mp3 文件 另一种声音来自麦克风 然后我需要将这个声音上传到服务器中 这可能吗 这一切都可以完成 但如果你看的是简单的例子 调用的方法很少 恐怕就没那么容易了 您可以使用以下命令从声音中提
  • 如何在 ItemRenderer 内使用数据网格范围外的变量?

    我使用将项目数组绑定到数据网格ItemRenderer 我用data变量来控制可绑定数据 我也有someComponentVariable需要插入到每一行中 但它是在组件范围内声明的 因此数据网格似乎无法重新识别它 编译错误 我如何使用这个
  • 通过Javascript捕获右键单击,无需节点

    当使用英语以外的任何其他语言时 Flash 播放器在 Firefox Chrome 中使用 wmode window 以外的任何内容时都会出现错误 此错误已报告但尚未修复 http bugs adobe com jira browse FP
  • 如何发送正确的授权标头以进行基本身份验证

    我正在尝试从 API 发布数据 但无法通过基本身份验证 I try ajax type POST url http theappurl com api v1 method data crossDomain true beforeSend f
  • 使用postmessage刷新iframe的父文档

    我有一个greasemonkey 脚本 它打开一个iframe 其中包含来自不同子域的表单作为父页面 我想在表单提交后刷新 iframe 时刷新父页面我现在可以在 iframe 刷新时执行一个函数 但无法让该函数影响父文档 我知道这是由于浏
  • Flash AS3 EventDispatcher - 有什么方法可以获取已注册侦听器的列表吗?

    有没有什么方法可以获取注册监听器的列表EventDispatcher 我知道EventDispatcher有hasEventListener方法告诉您是否注册了任何侦听器 但是有没有一种简单的方法来询问EventDispatcher找出听众
  • Flex PopUpManager:如何检测模式弹出窗口的存在?

    我的 Flex 3 应用程序有一些通过 PopUpManager 显示的模式对话框 但有时我希望其他视图组件知道有弹出窗口显示 PopUpManager 没有任何方法来实际检查弹出窗口是否存在 有没有其他方法可以在 flash flex 中

随机推荐

  • 从 Flutter 打开 Android Activity 和 iOS ViewController

    我有一个 Flutter 项目 需要一些需要在本机 Android Activity 或 iOS ViewController 中实现的某些功能 有没有办法导航到 android Activity 并向其传递数据 并在 Flutter 中从
  • 带有 MediaCodec Surface 的 AVC 硬件编码器可靠性如何?

    我正在开发一个 Android 应用程序 该应用程序使用 MediaCodec 使用 Surface 方法对 H 264 视频进行编码 我的目标是 Android 5 0 并且遵循了 bigflake com 中的所有示例和样本 我两年前开
  • MATLAB 中的矩阵乘法时间复杂度

    有谁知道MATLAB使用哪种算法进行矩阵乘法以及它的时间复杂度是多少 为了完整起见 如中所述这个线程 Matlab 使用DGEMM 双通用矩阵乘法 例程来自BLAS 基本线性代数子程序 请注意 BLAS 不存在单一的实现 它针对特定的处理器
  • newtonsoft json序列化时间跨度格式

    是否可以指定自定义格式TimeSpan序列化 使用Newtonsoft Json 我想要格式为 HH mm 的序列化字符串 例如 TimeSpan FromHours 5 gt 05 00 TimeSpan FromHours 5 gt 0
  • 更好的 git add -p 吗?

    有时我在没有安装 X Window 的系统上工作 并且无法使用 Git GUI 现有的控制台替代品是什么git add p 我几乎喜欢它所做的一切 实际上比 Git GUI 更喜欢 但我讨厌它不允许我查看整个图片并选择我想要查看块的顺序 这
  • .forEach 中 thisArg 的用途是什么?

    JavaScript 的对于每个文档指出 forEach语法是 arr forEach callback thisArg 有什么用thisArg The thisArg可以提供改变inner this的回调函数 未指定thisArg结果是t
  • 导入 theano 时出错“无法导入名称 gof”

    我目前收到错误 导入错误 无法导入名称 gof 导入 theano 时 gt gt gt import theano Traceback most recent call last File
  • 延迟生成 powerset

    我想计算一个集合的幂集 因为我不需要一次需要整个 powerset 所以最好延迟生成它 例如 powerset set a b c seq set set a set b set c set a b set a c set b c set
  • 组合 R + awk + ​​bash 命令

    我想结合awk和R语言 问题是我在指定目录中有一组 txt 文件 并且我不知道文件头的长度 在某些情况下 我必须跳过 25 行 而在其他情况下 我必须跳过 27 行等 所以我想输入一些 awk 命令来获取要跳过的行数 一旦获得该值 我就可以
  • 当初始化固定大小的 char 数组时没有足够的空间容纳 null 终止符时,不会出现编译器错误

    假设我有以下 c char 数组 char okaysize4 5 four line 5 char toosmall4 4 four line 6 char toosmall3 3 four line 7 当我使用 gcc 4 4 7 编
  • ES6 模板文字 - 从字符串中删除 \n

    我正在将多行变量更改为Template Literals太神奇了 但后来我注意到我所做的缩进被转换 缩小 为 n与我在原始代码上所做的缩进 我怎样才能避免这种情况 Ex var div div class proj div class bo
  • 如何在 Windows 窗体中模仿 JavaScript 的 onBlur 事件?

    我在 Windows 窗体上有电话和电子邮件文本框 我想在用户离开字段时对其进行验证 当我双击 Visual Studio 表单设计器中的文本框时 它会创建一个textchanged事件 这不太合适 因为仅当用户输入完整条目时才调用验证方法
  • 如何检查 perl 中是否声明了变量?

    我在用use strict 在 perl 中 我使用以下语句 unless defined x print Not defined 其中 x 没有在任何地方声明 所以我希望它打印 Not defined 但它返回一个错误 Global sy
  • 创建 JSONObject 时 org.json 未报告异常

    谁能帮助我理解出了什么问题 unreported exception org json JSONException must be caught or declared to be thrown jsonObj new JSONObject
  • 将浮点数组转换为字符串的最快方法是什么? [复制]

    这个问题在这里已经有答案了 在 C 中将浮点数组转换为字符串的最快方法是什么 如果我的数组包含这个 0 1 1 1 1 0 0 2 然后我希望每个条目转换为一个字符串 其值由空格分隔 即 0 1 1 1 1 0 0 2 我会选择最具可读性的
  • 在数据框上使用 If/Else

    我有一个数据集 看起来像 data lt c 0 1 2 3 4 2 3 1 4 3 2 4 0 1 2 0 2 1 2 0 4 frame lt as data frame data 我现在想在此数据框中创建一个新变量 如果 数据 列报告
  • Laravel 5 - 查找模型的分页页面

    我正在努力建立一个基本论坛 灵感来自laracasts com 讨论 当用户发布对主题的回复时 我想引导他们到列表的末尾分页回复及其回复的锚点 与 Laracasts 的行为相同 我还想在用户编辑回复之一时将其返回到正确的页面 我怎样才能知
  • LinkedList 上的 LINQ - 迭代 LinkedListNode,而不是 T

    我在理解如何在 LINQ 中执行某些操作时遇到问题 我有一个链表 对象的类型并不重要 重要的是我想做一些事情Where 基于当前对象之间的关系以及列表中的下一个 为什么我不能做类似的事情 linkedlist Where n gt a fu
  • 什么会导致算法具有 O(log n) 复杂度?

    我对大 O 的了解是有限的 当对数项出现在方程中时 它让我更加困惑 有人可以用简单的语言向我解释一下什么是O log n 算法是 对数从何而来 当我试图解决这个期中练习题时 特别出现了这个问题 令 X 1 n 和 Y 1 n 包含两个整数列
  • 如何修复此跨域 ActionScript 3 错误?

    我将尽可能具体和详细 并包含一些我正在使用的代码 我已经进行了搜索并发现这个问题 这看起来很相似 然而 作者使用的是 ActionScript 2 而不是 3 我似乎无法有效地将给出的任何答案应用于我自己的情况 我试图通过 Flash Ac