跨域
什么是跨域?
跨域問題是由于javascript語言安全限制中的同源策略造成的。同源策略是由Netscape提出的一個著名的安全策略。 現在所有支持JavaScript 的瀏覽器都會使用這個策略。同源策略阻止從一個域上加載的腳本去獲取或操作另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這說明瀏覽器隔離來自不同源的內容,以防止它們之間的操作。所謂同源是指域名,協議,端口均相同。
同源的幾種情況:
不同域名屬于跨域,如:www.a.com和www.b.com,另外www.a.com?和www.a.com.cn?也屬于不同域名。
主域名和子域名(二級域名、三級域名等)跨域,如:www.a.com?和?sub.a.com屬于跨域,sub.a.com?和?sub1.a.com?之間也是跨域。
協議屬于跨域,如:http://www.a.com?和?https://www.a.com。
不同端口,如:?www.a.com:80和?www.a.com:81?。
IP和域名屬于跨域,如:123.125.106.16?和www.weibo.com。
為什么要跨越?
我們實際上做項目的時候,不可避免地會根據項目需求進行跨站訪問,子域和主域之間數據共享等,受到同源策略的影響,要滿足這些需求,就要用跨域技術來實現。
跨域技術
設置頭文件:例如:
res.setHeader("Access-Control-Allow-Origin","*");
res.setHeader("Access-Control-Allow-Methods","GET,POST");
服務器代理:在服務器端設置代理文件,用來進行跨域請求,客戶端直接發送本域內的Ajax請求,從而達到跨域請求的目的。特點:在客戶端不存在跨域請求。需要增加代理文件,為了安全需要和對方約定。
jsonp:jsonp是一個簡單高效的跨域方式,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問。特點:不受同源策略的限制,兼容性更好,易于實現,只支持get。