跨域AJAX不发送X-Requested-With标头

时间:2011-11-17 07:50:28

标签: ajax http-headers cross-domain cors

http://www.a.com/service.asmx 上创建一个网络服务,然后从 http://www.b.向其发送跨域ajax请求。 COM 即可。检查 Firebug 实时HTTP标头中的标题,或者您希望的任何其他插件。

请求标头中没有 X-Requested-With HTTP标头字段的跟踪。

但是,如果您从同一个域向同一服务发送ajax请求(例如 http://www.a.com/about ),您将看到该标题字段。

为什么跨域ajax请求省略了 X-Requested-With 标头字段?

更新:我知道JSONP调用本质上不是AJAX调用。因此,在JSONP调用中,您将看不到任何 X-Requested-With 标题字段。

1 个答案:

答案 0 :(得分:70)

如果您使用jQuery来执行ajax请求,它将不会发送标头X-Requested-With(HTTP_X_REQUESTED_WITH)= XMLHttpRequest,因为它是跨域的。但是有两种方法可以解决这个问题并发送标题:

选项1)在ajax调用中手动设置标题:

$.ajax({
     url: "http://your-url...",
 headers: {'X-Requested-With': 'XMLHttpRequest'}
});  

选项2)告诉jQuery不要使用跨域默认值,因此它会在ajax请求中保留X-Requested-With标头:

$.ajax({
  url: "http://your-url...",
 crossDomain: false
});

但是这样,服务器必须允许这些头,然后服务器需要打印这些头:

print "Access-Control-Allow-Origin: *\n";
print "Access-Control-Allow-Headers: X-Requested-With, Content-Type\n";

上面的第一行将避免错误“Access-Control-Allow-Origin不允许原点。”
第二行将避免错误“请求标头字段X-Requested-With不允许使用Access-Control-Allow-Headers。”