使用特殊字符时服务器响应变得奇怪 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 实体,因此 ü
在 iFrame 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);
来解码响应中的 &
。
作为前端和 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 实体,因此 ü
在 iFrame 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);
来解码响应中的 &
。