我有以下代码,在所有现代浏览器中都可以正常工作,但在Internet Explorer 9及以下版本中就失败了。
authService.login = function(credentials) {
return $http.post('https://example.com/login', credentials).then(function(res) {
return res;
}, function(err) {
return err;
});
};
credentials
是一个看起来像这样的对象:
{
username: 'john@example.com',
password: 'smith'
}
问题是POST从未真正发生,而是直接跳转到return err;
,甚至没有设置错误。上面写着Impossible d'effectuer l'opération à cause de l'erreur suivante c00c023e.
。关键是c00c023e,这应该是一个编码问题,但我不明白如何完全阻止调用的发生。
"修复"是使用$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
,它允许IE POST,但我的后端期望JSON,所以没有帮助。
我使用的是AngularJS 1.2.22.
任何想法?
评论引导我走向正确的方向,这确实是一个CORS问题。事实证明,XDomain库提供了一个简单且与库无关的修复。
在发出CORS请求的应用程序中,在任何其他脚本之前包含以下脚本: 然后,在<!--[if lte IE 9]>
<script src="http://example.com/xdomain/xdomain.min.js" data-slave="http://example.com/xdomain/proxy.html"></script>
<![endif]-->
example.com
域中,复制xdomain.min.js
并创建上面在data-slave
属性中定义的proxy.html
文件。代理文件必须包含:
跨域请求现在可以在IE9及以下版本中正常工作。通过删除条件注释,您可以将XDomain用于所有浏览器,而不仅仅是IE,但我怀疑有很大一部分用户使用不支持CORS的浏览器,也不是Internet Explorer。<!DOCTYPE html>
<script src="xdomain.min.js" data-master="https://subdomain.example.com"></script>