跨域
由於瀏覽器對javascript的同源策略的限制,例如a.cn下面的js不能調用b.cn中的js,對象或數據(因為a.cn和b.cn是不同域),所以跨域就出現了.
跨域的安全限制都是對瀏覽器端來說的,服務器端是不存在跨域安全限制的。
同源策略
同源策略/SOP(Same origin policy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。
實現跨域的方法
通過jsonp實現跨域
jsonp 全稱是JSON with Padding,是為了解決跨域請求資源而產生的解決方案,是一種依靠開發人員創造出的一種非官方跨域數據交互協議。
一個是描述信息的格式,一個是信息傳遞雙方約定的方法。
jsonp的產生:
1.AJAX直接請求普通文件存在跨域無權限訪問的問題,不管是靜態頁面也好.
2.不過我們在調用js文件的時候又不受跨域影響,比如引入jquery框架的,或者是調用相片的時候
3.如果想通過純web端跨域訪問數據只有一種可能,那就是把遠程服務器上的數據裝進js格式的文件里.
4.而json又是一個輕量級的數據格式,還被js原生支持
5.為了便於客戶端使用數據,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許用戶傳遞一個callback 參數給服務端,
(1)jquery的jsonp方式跨域請求
$(function(){
var name='cc';
var looks='handsome';
$.ajax({
url: "http://localhost:9090/student", type: "GET",
data:{
name:name,
looks:looks
},
cache:false, dataType: "jsonp", //指定服務器返回的數據類型
jsonp:'theFunction',//用以獲得jsonp回調函數名的參數名(默認為:callback)
jsonpCallback: "showData", //指定回調函數名稱
success: function (data) {
console.info("調用success"); }
});
})
jsonp方式不支持POST方式跨域請求,就算指定成POST方式,會自動轉為GET方式;而后端如果設置成POST方式了,那就請求不了了。
(2)基於script標簽實現跨域
凡是擁有src這個屬性的標簽都可以跨域例如<script><img><iframe>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> var message = function(data) { alert(data[1].title); }; </script> <script type="text/javascript" src="http://web.cn/js/message.js"></script> </head> <body> <div id='testdiv'></div> </body> </html>
(3)vue.js
this.$http.jsonp('http://www.domain2.com:8080/login', { params: {}, jsonp: 'onBack' }).then((res) => { console.log(res); })