2011-11-17 43 views
35

http://www.a.com/service.asmx上創建一個web服務並向其發送一個跨域ajax請求http ://www.b.com。檢查FirebugLive HTTP標頭中的標頭,或者您希望的任何其他插件。跨域AJAX不會發送X-Requested-With標頭

請求頭中沒有跟蹤X-Requested-With HTTP Header字段。

但是,如果您從相同的域(例如http://www.a.com/about)向同一服務發送ajax請求,您將看到該標題字段。

爲什麼X-Requested-With標題字段爲省略跨域Ajax請求?

更新:我知道JSONP調用本質上不是AJAX調用。因此,在JSONP調用中,您將看不到任何X-Requested-With頭字段。

回答

60

如果您使用jQuery來執行您的ajax請求,它將不會發送頭X-Requested-With(HTTP_X_REQUESTED_WITH)= XMLHttpRequest,因爲它是跨域。但也有2種方式來解決這個問題,併發送標題:

選項1)手動設置頁眉在Ajax調用:

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

選項2)告訴jQuery的不使用跨域違約,所以它將保持X-要求,隨着頭在Ajax請求:

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

但有了這個,服務器必須允許這些頭,那麼服務器需要打印的標題:

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

上面的第一行將避免錯誤「訪問控制允許來源不允許來源」。
第二行將避免錯誤「請求標頭字段X-Requested-With不被Access-Control-Allow-Headers所允許」。

+16

第一行還允許所有人對您的服務器進行跨域請求,這通常不是一個好主意。應該通過檢查白名單中的「Origin」標題來動態設置「Access-Control-Allow-Origin」標題。 –