作为前端和AJAX,我使用的是Ext,遇到了以下问题:
我正在上传一个文件,该文件将被上传到后端,后端将在存储库中使用相应的文件路径回答,包括一些元数据。整个答案是HTML结构中的JSON。(这需要完成,因为Ext文件上传会创建隐藏的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的域。
发布于 2016-11-28 15:42:15
造成问题的原因是响应周围的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);来解码响应中的&。
https://stackoverflow.com/questions/40805836
复制相似问题