跨子域ajax请求被拒绝,即使文档.正确设置域
Cross-subdomain ajax request denied even when document.domain is set correctly
在我的应用程序中,我有一个网站在一个子域(dev.u413.com),我使用jQuery使ajax请求JSON api在另一个子域(api.u413.com)。当我检查请求在Chrome开发工具和Firefox Firebug似乎我的请求被阻止的Access-Control-Allowed-Origin
。我将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
不能与AJAX一起工作。它用于跨域iframe和窗口通信。在您的情况下,您违反了同源策略(表的最后一行),因此您需要使用JSONP或服务器端桥接。
这是一个很好的指南,说明了实现跨域AJAX请求的不同技术。
同源策略是我必须处理的最令人沮丧的浏览器相关主题之一。对我来说愚蠢的是,同一域的2台服务器不能通信。不幸的是,同源策略认为,即使是在不同端口上向同一服务器发出的2个请求也违反了同源策略。我认为这将在未来的浏览器中变得更好:
http://www.html5rocks.com/en/tutorials/file/xhr2/查找:Cross Origin Resource Sharing (CORS)
基本上,你的服务器只需要设置一个响应头,说"是的,允许跨域或跨子域调用服务器xyz"。
我确信所有的浏览器都支持这个功能还需要一段时间(而且我必须支持ie8,直到我们的大多数用户都放弃它)——但至少隧道尽头有光。您还需要将document.domain = 'u413.com
添加到您的其他子域名
是不可能使常规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');
- 设置文档位置href会阻止设置cookie
- 如何在新的Meteor Collection文档中设置服务器上的created_on字段
- 设置'文档'在FireFox中
- 如何设置javascript中引用的文档的URL
- 第三方javascript设置文档.cookie
- 如何在 asp.net 中设置文档模式怪癖
- 如何获取和设置鼠标单击x,y打开的pdf文档的位置
- 将文档高度设置为负 100px
- 将焦点设置为框架内的文档 (jQuery)
- MongoDB:确保只有一个文档可以将字段设置为 true
- 在文档加载时使用 JQuery 在下拉字段中设置默认值
- 如何将文档属性(例如 document.webkitFullscreenElement)设置为 null
- 如何为 HTML 文档请求的 JS 和 CSS 文件设置 http “accept” 标头
- 设置文档域时出现“访问被拒绝”错误
- 在 Web 视图中设置 innerHTML 将替换整个文档,而不仅仅是元素
- 在Firefox中强制将焦点设置回内容可编辑文档
- 如何查找文档中的所有数字并设置它们的样式
- 从特定iframe本身中呈现的文档设置iframe属性
- 如何为嵌套的Mongoose文档设置select=false
- 在JavaScript中从文档设置双重getElementById