跨域請求?兩種解決方案CORS與JSONP
什麼是同源?什麼是跨域?
跨域是指從一個域名的網頁去請求另一個域名的資源,即請求不同源的資源。
同源的三個條件:
網路協議、埠、域名(子域名)全部相同,三者缺一不可。
有任何一個不同,則涉及到跨域,詳見表格:
URL | 說明 | 是否允許通訊 |
---|---|---|
http://www.a.com/a.js http://www.a.com/b.js |
同一域名下 | 允許 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js |
同一域名下不同資料夾 | 允許 |
http://www.a.com:8000/a.js http://www.a.com/b.js |
同一域名,不同埠 | 不允許 |
http://www.a.com/a.js https://www.a.com/b.js |
同一域名,不同協議 | 不允許 |
http://www.a.com/a.js http://70.32.92.74/b.js |
域名和域名對應ip | 不允許 |
http://www.a.com/a.js http://script.a.com/b.js |
主域相同,子域不同 | 不允許 |
http://www.a.com/a.js http://a.com/b.js |
同一域名,不同二級域名 | 不允許 |
目前比較主流的解決方案有兩種,CORS與JSONP。
CORS(corss origin resource share) 相容度低
跟前端沒有任何關係在伺服器端設定“允許跨域訪問”即可。
注意:
HTML5語法,前提條件是瀏覽器需要支援這個header(IE10及以下的瀏覽器不支援)
支援所有的跨域訪問,但存在安全風險
<?php
header('Access-Control-Allow-Origin: *');
?>
只支援該域名訪問(定向)
header('Access-Control-Allow-Origin: http://a.com');
JSONP 相容度高
原理:
dom元素的src屬性可以跨域獲取資源,而且這種方案不受瀏覽器的限制。
傳遞的資料為JSON格式,p可以理解為package,將資料打包進JSON。
不需要後臺特殊處理。
注意:
- 有src屬性的標籤有:<img>、<script>
- JSONP只能用於發起GET請求,無法發起JSONP的POST請求
JSONP的原生JS語法
將“訪問連結?callback=函式名”寫入內容為空的script標籤的src中。
<script> //函式即對所請求回來的資料進行的處理方法
function doSomething(backData){
console.log(backData);
}
</script>
<script src="http://192.168.19.68/2018-1-5/05.JSONP/api/backData.php?callback=doSomething"></script>
jQuery請求JSONP
<script src="./js/jquery-1.12.4.min.js"></script>
<script>
$(function(){
$('h2').click(function(){
$.get({
//請求地址
url:"http://192.168.19.68/2018-1-5/05.JSONP/api/backData.php",
success:function(backData){
console.log(backData); //函式即對所請求回來的資料進行的處理方法
},
dataType:'jsonp' // 人為的告訴jQ這是JSONP的介面
})
})
})
</script>
jQuery封裝好的JSONP方法
$.getJSON( "http://b.a.com/bar?callback=callback", function( data ){
// 處理跨域請求得到的資料
});
相關文章
- 解決跨域的兩種方案JSONP和CORS跨域JSONCORS
- JSONP解決跨域請求問題JSON跨域
- 搞定所有的跨域請求問題: jsonp & CORS跨域JSONCORS
- CORS跨域請求CORS跨域
- java解決請求跨域的兩種方法Java跨域
- web前端跨域解決方案JSONP,CORS,NGINX反向代理Web前端跨域JSONCORSNginx
- springboot設定cors跨域請求的兩種方式Spring BootCORS跨域
- CORS跨域請求總結CORS跨域
- 跨域問題,解決方案 – CORS方案跨域CORS
- 跨域問題,解決方案 - CORS方案跨域CORS
- php 支援jsonp跨域請求PHPJSON跨域
- Ajax 跨域請求 Access to XMLHttpRequest 解決方案跨域XMLHTTP
- CORS跨域時,為何會傳送兩次請求?CORS跨域
- ArkWeb網路安全基礎 - 跨域請求與解決方案Web跨域
- 使用cors完成跨域請求處理CORS跨域
- ajax跨域請求之CORS的使用跨域CORS
- WebApi 跨域問題解決方案(3):CORSWebAPI跨域CORS
- Springboot處理CORS跨域請求的三種方法Spring BootCORS跨域
- CORS跨域限制以及預請求驗證CORS跨域
- 簡單的實現jsonp跨域請求JSON跨域
- cors解決跨域問題CORS跨域
- 跨域的幾種解決方案跨域
- Koa2框架利用CORS完成跨域ajax請求框架CORS跨域
- Nginx解決前端跨域問題 CORS跨域配置Nginx前端跨域CORS
- 深入跨域問題(2) - 利用 CORS 解決跨域跨域CORS
- 前端http請求跨域問題解決前端HTTP跨域
- 深入跨域問題(3) – 利用 JSONP 解決跨域跨域JSON
- 深入跨域問題(3) - 利用 JSONP 解決跨域跨域JSON
- CORS跨域時,為何會出現一次動作,兩次請求?CORS跨域
- JS傳送跨域Post請求出現兩次請求的解決辦法JS跨域
- 跨域請求之jQuery的ajax jsonp的使用解惑跨域jQueryJSON
- PHP AJAX JSONP實現跨域請求使用例項PHPJSON跨域
- 盤點 Spring Boot 解決跨域請求的幾種方法Spring Boot跨域
- 同源政策與跨域請求跨域
- zuul實現Cors跨域的兩種方式(https)ZuulCORS跨域HTTP
- 跨域請求跨域
- SpringBoot解決跨域請求攔截Spring Boot跨域
- 中止請求和超時 跨域的HTTP請求 認證方式 JSONP跨域HTTPJSON