跨域問題

同源問題

協議,域名,端口任意一個不一樣的話,都是不一樣源網址.javascript

同源意味着兩個請求地址只在路徑上有不一樣.php

基於網絡安全,默認的,ajax不容許不一樣源的訪問
css

示例:html

//當前頁面是sitea.io/sitea-index.php
$(function () {
    $.ajax({
        url:"http://siteb.io/siteb-time.php",
        success:function (res){
            console.log(res);
        }
    });
})
複製代碼


Access to XMLHttpRequest at 'http://siteb.io/siteb-time.php' from origin 'http://sitea.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.java

這是一個十分經典的錯誤,之前作客戶端開發的時候也遇到過,可是不明白是什麼問題.ajax

在sitea.io訪問siteb.io下面的數據,被CORS策略阻塞,在request header中須要設置Access-Control-Alllow-Origin.chrome


問題的核心在於獲取不一樣源頁面的數據json

1. 經過img標籤能夠當前頁面訪問到不一樣源數據跨域

<!-- 當前頁面爲http://sitea.io/sitea-index.php -->
	<img src="http://siteb.io/img/02.jpeg">
複製代碼


那麼若是把圖片鏈接換成一個php文件呢?瀏覽器

<img src="http://siteb.io/siteb-time.php">

//siteb-time.php 代碼
<?php 
echo time();
 ?>
複製代碼


雖然請求siteb-time.php狀態碼爲200,是ok的,可是瀏覽器默認按照圖片處理,沒法訪問response

2. 經過link標籤能夠獲取跨域請求

//sitea-index.php代碼
<link rel="stylesheet" type="text/css" href="http://siteb.io/css/style.css">
複製代碼

請求http://siteb.io/css/style.css


可是沒辦法使用代碼操做響應

那麼link標籤的href放一個php標籤呢?而且修改rel和type,能這樣作嗎?link標籤能夠作那些事?


強行連接一個php文件,會發生什麼呢?

<link rel="stylesheet" type="text/css" href="http://siteb.io/siteb-time.php">
複製代碼


請求資源能夠成功,可是不能操做響應


3.script標籤能夠引入外部js文件

強行src連接一個php文件

<script type="text/javascript" src="http://siteb.io/siteb-time.php"></script>複製代碼

會發生什麼呢?


照樣能夠獲取到php文件的內容,可是如何操做呢?可不能夠服務端返回js代碼?,那麼客戶端實際執行到一段js代碼


script標籤既能夠引入一個外部腳本,也能夠包含腳本語句.服務端中獲取到數據以後,調用一個服務端定義好的函數,把響應數據做爲參數,不就能夠操做到響應了.

客戶端代碼	
<script type="text/javascript">
		function foo(data){
			console.log(data);
		}
</script>
<script type="text/javascript" src="http://siteb.io/siteb-time.php"></script>
服務端代碼
<?php 
echo "foo(${time()});"
 ?>複製代碼

結果


提示爲:

Cross-Origin Read Blocking (CORB) blocked cross-origin response http://siteb.io/siteb-time.php with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

跨域訪問塊CORB阻塞了跨域響應

發現是由於傳遞的參數應該是string類型的

<?php 
$arr = array('name' => '張三','age' => 18, 'weight' => 188.6);

$str = json_encode($arr);
$foo = "function foo(res){console.log(res);alert(res);};foo(${str});";
echo $foo;
 ?>
複製代碼


這實際上就解決了跨域問題

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息