作为前端和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的域名。
答案 0 :(得分:1)
问题的原因是响应的HTML包装器以及JSON写入包装器的方式。
最初,JSON直接写入正文中的HTML响应,这导致浏览器将内容解释为HTML实体,因此{i}在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);
。