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

Sae*_*ati 47 ajax cross-domain http-headers cors

http://www.a.com/service.asmx上创建Web服务,并从http://www.b.com向其发送跨域ajax请求.检查Firebug中的标头,或Live HTTP标头或您希望的任何其他插件.

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

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

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

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

Rod*_*ira 77

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

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

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

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

$.ajax({
  url: "http://your-url...",
 crossDomain: false
});
Run Code Online (Sandbox Code Playgroud)

但有了这个,服务器必须允许这些头,然后服务器需要打印这些头:

print "Access-Control-Allow-Origin: *\n";
print "Access-Control-Allow-Headers: X-Requested-With, Content-Type\n";
Run Code Online (Sandbox Code Playgroud)

上面的第一行将避免错误"Access-Control-Allow-Origin不允许原点".
第二行将避免错误"请求标头字段X-Requested-With不允许访问控制允许标头".

  • 第一行还允许每个人对您的服务器执行跨域请求,这通常不是一个好主意.应通过针对白名单检查"Origin"标头来动态设置"Access-Control-Allow-Origin"标头. (16认同)