跨域外部接口“NPObject 上的错误调用方法”

Posted

技术标签:

【中文标题】跨域外部接口“NPObject 上的错误调用方法”【英文标题】:Cross Domain ExternalInterface "Error calling method on NPObject" 【发布时间】:2010-11-05 12:53:35 【问题描述】:

我正在尝试通过 ExternalInterface 跨域启用 javascript 和 Flash 之间的通信。当 Javascript 位于与 SWF 相同的域中时,它的效果很好。但在一种情况下,html 位于域 A,javascript 和 flash 都位于域 B。我已完成以下所有操作:

嵌入标签有allowScriptAccess="always"(对象有它作为参数) 我的 SWF 文件的 actioncipt 有 Security.allowDomain("*") 我的 SWF 也调用了Security.allowInsecureDomain("*") 域 A 和域 B 都有一个 /crossdomain.xml 文件,其中有 allow-access-from domain="*"

SWF 可以在页面上调用 javascript,但是当我使用 Javascript 调用 ExternalInterface 公开的函数时,我得到了

在 NPObject 上调用方法时出错! [插件异常:Actionscript 中的错误。使用 try/catch 块来查找错误。]

这是 ActionScript 2,所以 ExternalInterface.marshallExceptions 不可用。

【问题讨论】:

您是否加载了多个 swf?还是域 A 上的 swf(带有 HTML)加载域 B 上的 swf? Alex -- 好点,我没有提到。来自域 B 的 javascript 从域 B 加载了一个 SWF,而该 SWF 从域 B 加载了第二个 SWF。这种加载似乎有效,但我不能确定,因为我无法与 SWF 交互。 【参考方案1】:

你应该只需要两件事就可以了:

1) allowscriptaccess=always 将允许您的 swf 将内容发送到页面

2) System.security.allowDomain("yourhtmldomain.com");

请注意,它在 AS2 中是 System.security.allowDomain() - 它与 AS3 或您上面写的不同。

上面的数字 2 允许 domainA 上的 html 页面调用 domainB 上 swf 中的东西。

你的 js 所在的域在这里无关紧要,因为浏览器将它嵌入到 domainA 中,脚本在 domainA 中执行。

crossdomain.xml 主要只用于加载远程文件,您没有这样做,因此您可以根据需要将其删除。 (而且您可能不希望在您的主域上拥有一个带有 allow="*" 的 crossdomain.xml 文件,这是非常糟糕的做法)

【讨论】:

奇怪的事情。我的 SWF 和 JS/HTML 都在同一个页面上,但这个异常仍然存在 :(【参考方案2】:

由于您要加载多个 swf,您可能需要在域 B 上加载的每个 swf 中包含安全设置。

您可能还需要具有适当安全设置的加载程序上下文。

import flash.system.LoaderContext;
import flash.system.ApplicationDomain;
import flash.system.Security;
import flash.system.SecurityDomain;
import flash.net.URLRequest;
import flash.net.URLLoader;

var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, (Security.sandboxType == Security.REMOTE) ? SecurityDomain.currentDomain : null);
var l:Loader = new Loader();
l.load(new URLRequest("http://example.com/myswf.swf"), context);

【讨论】:

嗨,我有同样的问题,每当我尝试在安全域中输入 NULL 以外的内容时,我都会收到错误:错误 #2114:参数 LoaderContext.securityDomain 必须为空。有什么建议吗?【参考方案3】:

对我来说有几个原因是(我正在使用uploadify):

http 服务器无权将文件写入目标 swfobject (flash) 没有跨域访问

解决方案: html 中的 object 标签必须有 allowScriptAccess="always" 可以通过 set param like 来完成

$('#file_upload').uploadifySettings('scriptAccess', 'always')
than flash object must have:
import flash.system.Security;
Security.allowDomain('remotedomain.com'); 

可以通过使用此参数编译源代码来完成,我有,如果您需要它,请使用 uploadify 主题写信给我。 比页面中包含 flash 的远程服务器必须在根 crossdamoin.xml 文件中具有如下内容:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

【讨论】:

【参考方案4】:

我遇到了同样的问题(allowDomain 等都很好),但我发送到 flash 错误参数 - 只是从 ajax 调用输出 JSON。问题消失了,当我将该 json 放入“”中,然后将其解析为 javascript 对象(通过 jQuery.parseJSON)。

【讨论】:

【参考方案5】:

在 Flash Player 版本 10 中使用 AS3 我无法让 ExternalInterface.addCallback() 在本地测试中正常工作。通过添加值为“all”(http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001079.html)的参数“allowNetworking”,我终于让我的本地副本工作了。祝所有为此苦苦挣扎的人好运!

【讨论】:

【参考方案6】:

就我而言,这是因为我正在修改包含上传器 div 的 DOM 元素。

我使用 jquery hide() 函数来隐藏包含上传器的 div,当我意识到导致上述错误时,我尝试了另一种方法,即设置 div 的“float”属性。在这两种情况下,它都会破坏上传器。

FWIW,似乎将包含上传者的 div 的宽度/高度设置为 0 不会导致错误发生。

【讨论】:

n.b.,Flash 知道它何时可见,因此通过 DOM 使电影不可见可能会立即停止 Flash 执行。

以上是关于跨域外部接口“NPObject 上的错误调用方法”的主要内容,如果未能解决你的问题,请参考以下文章

nginx 代理解决跨域问题

什么叫ajax跨域访问

node跨域cors模块,nodejs+express跨域

$http跨域请求怎么解决

spring boot 登录重定向外部地址,出现跨域问题 怎么办?

使用vue-element-admin框架调用后端接口及跨域问题