gpt4 book ai didi

javascript - 使用特殊字符时,服务器响应会奇怪地进行编码/解码

转载 作者:太空宇宙 更新时间:2023-11-04 16:19:14 24 4
gpt4 key购买 nike

作为前端和 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会接收服务器的响应,然后从iFrame中获取响应来伪造响应。响应文本。我们的浏览器弹出窗口的域变得宽松,但 iFrame 的域却没有,因此我们遇到了同源策略问题,并且 response.responseText 为空。为了解决这个问题,我们还使用前面提到的 HTML 包装器来放宽 iFrame 的域。

最佳答案

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

最初,JSON 直接写入正文内的 HTML 响应中,这导致浏览器将内容解释为 HTML 实体,因此 ü 被解码为 ü 在 iF​​rame HTML 中。之后,当 ExtJS 从隐藏的 iFrame 获取响应时,它会被编码,但只有 & 而不是 ü。解决方案是在通过 JS 渲染 body 后添加 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); 来解码响应中的 &

关于javascript - 使用特殊字符时,服务器响应会奇怪地进行编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com