将 Base64 字符串从 AS3 返回到 Javascript.这是一个错误或功能(还是我错了?

Returning Base64 string from AS3 to Javascript. Is this a bug or feature (or am I wrong?)

本文关键字:错误 一个 功能 我错了 返回 AS3 Javascript Base64 字符串      更新时间:2023-09-26

在我最近开发一个更大的项目时,我遇到了AS3 ExternalInterface的奇怪行为,当试图将Base64编码的数据从AS3发送到Javascript时。我已将代码精简为最简单的版本,如下所示:

TestSWF.as文件:

package {
    import flash.external.ExternalInterface;
    import flash.display.Sprite;
    public class TestSWF extends Sprite {
        public function callTestSWF():String {
            var strToRet:String = '/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+';
            trace(strToRet);
            return strToRet;
        }
        public function TestSWF() {
            ExternalInterface.addCallback("CallTestSWF", callTestSWF);
        }
    }
}

此文件使用 Flex-SDK 4.6 编译,使用

mxmlc -output test.swf -compiler.omit-trace-statements=false -static-link-runtime-shared-libraries -- TestSWF.as

对应的index.html文件为:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Test SWF</title>
</head>
<body style="font-family:sans-serif;">
    <script>
        function getStr() {
            var flash = document.getElementById('swfObj');
            var outText = flash.CallTestSWF();
            document.getElementById('fromFlash').innerHTML = outText;
        }
    </script>
    <input type="button" onclick="getStr();" id="sendToFlash"  value="Call Flash"/>
    <hr/>
    <pre id="fromFlash">---</pre>
    <hr/>
    <embed id="swfObj" src="test.swf">
</body>
</html>

现在,当这个index.html由Web服务器公开并且客户端浏览器配备了flash播放器的调试版本(v.20.0)时,我收到一个非常奇怪的警告

WARNING: For content targeting Flash Player version 14 or higher, ExternalInterface escapes strings using JSON conventions. To maintain compatibility, content published to earlier Flash Player versions continues to use the legacy escaping behavior.

值得一提的是,任何地方都没有使用JSON。请注意,从 AS3 返回的字符串包含 Base64 代码中使用的完整字符集。删除"/"时,此警告将消失。

这是一个错误还是这种烦人行为的解释是什么?欢迎任何评论。

每当您将特殊字符传递过去以不同方式转义的ExternalInterface时,就会发生这种相当烦人的警告。在大多数情况下,您可以忽略它。

详细说明:在Flash Player 14之前,用于转义通过ExternalInterface的字符串的内部方法存在许多问题(例如JS注入漏洞),导致开发人员提出了正则表达式的解决方法。当 Flash Player 14 中的转义行为被更改(使用 JSON 约定)时,它可能会破坏许多开发人员先前的修复,因此他们选择支持针对旧玩家的 SWF 的旧版转义行为,而不是仅仅发布重大更改,并在字符串通过包含字符的ExternalInterface时发出警告开发人员可能试图以某种奇怪的方式进行转义以支持旧版转义行为, 这将破坏新行为。换句话说,此警告并不是说您做错了什么,而是让您意识到Flash Player中的行为已更改了您正在使用的某些字符串。如果字符串按预期工作,则警告不是问题,您无需执行任何操作。这就是为什么我说它"烦人"。它基本上是一个"旧版 API 警告",除了 API 是相同的,它是现有 API 的行为,具有您可能需要注意的旧行为。

如果你在互联网上搜索,你会发现这个故事的片段到处都是。

如果您真的希望警告消失,您可以对特殊字符进行编码。根据我的经验,最简单的方法是在另一端使用 encodeURIComponentdecodeURIComponent

.HTML:

<script>
    function getStr() {
        var flash = document.getElementById('swfObj');
        var outText = decodeURIComponent(flash.callTestSWF());
        document.getElementById('fromFlash').innerHTML = outText;
    }
</script>

AS3:

public function callTestSWF():String {
    var strToRet:String = encodeURIComponent('/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+');
    trace(strToRet);
    return strToRet;
}

或者您可以使用正则表达式,但就您个人而言,在您的情况下,我只会忽略警告,知道您的代码正常工作并且不会引入一些脆弱的正则表达式。

相关文章: