使用特殊字符

时间:2016-11-25 13:09:08

标签: javascript json extjs encoding decoding

作为前端和AJAX lib我使用的是Ext JS,我遇到了以下问题:

我正在上传一个文件,该文件应上传到后端,后端用存储库中相应的文件路径回答,包括一些元数据。整个答案是HTML结构中的JSON。 (这需要完成,因为Ext js文件上传会创建一个隐藏的iFrame,否则iFrame的域与浏览器不同)

后端在响应中回答以下路径:

/documents/test/uploadTesthtml_ü_&/uploadTesthtml_ü_&.jpg

在网络面板中,路径正确。但是一旦成功处理程序启动,响应就会包含以下路径:

/documents/test/uploadTesthtml_ü_&/html_ü_&.jpg

我觉得这很难理解,当你没有看到它的生命,但我们需要为这个特定的用例做好准备,我希望你能按照我的解释。

编辑为@ Alexander的评论答案:

我们正在使用Java后端,并围绕我们的JSON响应使用以下HTML结构:

<html>
    <head>
        <script>
            function doDomainRelaxing() {
                var x = location.hostname.indexOf('.') + 1;
                if (x > 0)
                    document.domain = location.hostname.substring(x);
            }
            doDomainRelaxing();
        </script>
    </head>
    <body>
        [{...}] //JSON response
    </body>
</html>

据我所知,原因是,ExtJS使用隐藏的iFrame进行文件上传,它将从服务器接收响应,之后,响应将从iFrame中获取以伪造响应。 responseText的。我们的浏览器弹出窗口的域名已放宽,但iFrame的域名没有,因此我们遇到了相同原始策略的问题,而response.responseText为空。为了解决这个问题,我们使用上面提到的HTML包装器来放宽iFrame的域名。

1 个答案:

答案 0 :(得分:1)

问题的原因是响应的HTML包装器以及JSON写入包装器的方式。

最初,JSON直接写入正文中的HTML响应,这导致浏览器将内容解释为HTML实体,因此{i}在iFrame HTML中被解码为&uuml;。之后,当ExtJS从隐藏的iFrame中获取响应时,它被编码,但只有ü而不是&。解决方案是在通过JS呈现正文后添加JSON响应。

ü

之后我不得不在成功处理程序中使用<html> <head> <script> function doDomainRelaxing() { var x = location.hostname.indexOf('.') + 1; if (x > 0) document.domain = location.hostname.substring(x); } doDomainRelaxing(); </script> </head> <body> <script> document.body.innerText = [{...}] //JSON response </script> </body> </html> 来解码响应中的Ext.htmlDecode(response.responseText);