Javascript 即使document.domain设置正确,跨子域ajax请求也被拒绝
在我的应用程序中,我在一个子域(dev.u413.com)上有一个网站,我使用jQuery向另一个子域(api.u413.com)上的JSON api发出ajax请求。当我在Chrome dev tools和Firefox Firebug中检查请求时,我的请求似乎被Javascript 即使document.domain设置正确,跨子域ajax请求也被拒绝,javascript,jquery,json,cross-domain,jsonp,Javascript,Jquery,Json,Cross Domain,Jsonp,在我的应用程序中,我在一个子域(dev.u413.com)上有一个网站,我使用jQuery向另一个子域(api.u413.com)上的JSON api发出ajax请求。当我在Chrome dev tools和Firefox Firebug中检查请求时,我的请求似乎被允许的访问控制源阻止了。我将document.domain设置为当前域的后缀:document.domain='u413.com' 这是我的要求: $.ajax({ dataType: 'json',
允许的访问控制源阻止了。我将document.domain
设置为当前域的后缀:document.domain='u413.com'代码>
这是我的要求:
$.ajax({
dataType: 'json',
data: { parseAsHtml: true, cli: 'help' },
url: 'http://api.u413.com/',
success: function (response) {
alert(response.Command);
}
});
如果我将ajax请求修改为在同一个域上,则请求成功
$.ajax({
dataType: 'json',
crossDomain: false,
data: { parseAsHtml: true, cli: 'help' },
url: 'http://dev.u413.com/',
success: function (response) {
alert(response.Command);
}
});
为什么会发生这种情况?浏览器不应该抱怨跨域问题,因为我根据上的指南将document.domain
设置为两个子域的通用后缀
我的应用程序目前正在使用jsonp,但我觉得适当的ajax请求应该按照我上面链接的同一源策略工作。如果不需要的话,我宁愿不使用jsonp。无法跨子域进行常规ajax请求吗?您需要将document.domain='u413.com
添加到其他子域。document.domain
不适用于ajax。它用于跨域iframe和窗口通信。在您的情况下,您违反了(表的)同源策略,因此需要使用JSONP或服务器端网桥
下面是一个非常有趣的例子,说明了实现跨域AJAX请求的不同技术。同源策略是我不得不处理的与浏览器相关的最令人沮丧的话题之一。我很傻,同一个域上的两台服务器无法通信。不幸的是,同源策略甚至认为对同一服务器但在不同端口上的两个请求违反了同源策略。我认为这将在未来的浏览器中变得更好:
搜索:跨来源资源共享(CORS)
基本上,您的服务器只需设置一个响应头,说“是的,允许跨域或跨子域调用服务器xyz是可以的”
我敢肯定,所有浏览器都支持ie8还需要一段时间(无论如何,我必须支持ie8,直到我们的大多数用户都不支持ie8)——但至少在这条隧道的尽头还有光明
不可能跨子域进行常规ajax请求吗
从技术上讲,这不是AJAX,但您可以通过跨域成功提交表单来模拟AJAX请求。缺点是您无法访问响应,这将导致页面重定向到表单的ACTION
URL
与此相反:
jQuery.post('https://www.com',
'offerCode':523153,
'accountNumber':'',
'_item.x':'42',
'_item.y':'21'
});
使用以下命令:
jQuery('<form action="https://www.com" method="POST">
<input type="text" name="offerCode" value="523153">
<input type="text" name="accountNumber" value="">
<input type="text" name="_item.x" value="42">
<input type="text" name="_item.y" value="21">
</form>').trigger('submit');
jQuery('
)。触发器('submit');
我不想要jsonp,这是我的观点。我想跨子域执行正确的AJAX请求,这应该是允许的。@ALex我已经阅读了该文档,现在我正在考虑另一种方式:)@DarinDimitrov我如何在api域上设置它?它只是一个返回JSON数据的api。(例如)@AlexFord,别介意我犯了一个错误并删除了我的评论。当您使用AJAX时,document.domain与您的场景无关。看看我的答案。我在哪里加上?这是一个只返回JSON的api。@Alex,JSONP才是最好的选择<代码>文档。域
只允许两个文档进行协作。也许不允许,但在CORS之前,没有太多选择。啊,好的。谢谢你的帮助。我已经和JSONP一起工作了,这很好。我只是觉得很沮丧,当我认为它应该这样工作的时候,我不能让它工作。再次感谢。“好指南”上说网站被黑客攻击了:(所以如果我使用一个iframe并用javascript获取iframe的内容,它应该会工作吗?唉……你的好指南是“被Ben攻击者黑客攻击”。为什么每个人都表现得像JSONP解决了任何问题。好吧,继续,试着用JSONP做一篇CORS文章,看看这能让你走多远。