使用特殊字符时服务器响应变得奇怪 en-/decoded

Server Response gets weirdly en-/decoded when using special characters

作为前端和 AJAX 库,我正在使用 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 中获取响应以伪造response.responseText。我们的浏览器弹出窗口的域变得宽松但 iFrame 的域没有,因此我们遇到了同源策略的问题并且 response.responseText 是空的。为了解决这个问题,我们使用提到的 HTML 包装器来放宽 iFrame 的域。

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

最初,JSON 直接写入主体内的 HTML 响应,这导致浏览器将内容解释为 HTML 实体,因此 &uuml; 在 iF​​rame HTML 中被解码为 ü。之后,当 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); 来解码响应中的 &amp;