一般來說 - 是的,您需要使用JSONP執行跨域或跨協議請求才能遵守同源策略。
爲了提供一個替代使用頁眉設置訪問控制允許來源「*」 這是不是在每一個瀏覽器的支持,如有變更等
您可以使用PHP或其他服務器端編程語言通過在您的ajax url中請求同源(本地)php腳本來模仿來自不同來源或協議的同源響應。
在PHP和jQuery的情況下 - 這裏是一些通用的例子。
以下兩種方法都存在爭議,容易出錯,並且會受到跨站點腳本攻擊的影響,正如標題集Access-Control-Allow-Origin「*」!
所以一定要格式化您自己的CSRF令牌或密鑰握手,轉義任何形式的用戶輸入,或使用框架來標準化請求/響應以防止攻擊。
服務器爲了接收外部數據需要做額外的頁面請求也有相關的開銷,但比期望客戶端和服務器支持Header set Access-Control-Allow-Origin「更可靠」* 「
向服務器端腳本發送本地請求,並期望json作爲響應。
HTML
<script type="text/javascript">
$.ajax({
type: 'get',
url: '/get_cross_domain.php',
dataType: 'json',
data: {
'foo' = 'bar'
},
success: function(data){
console.log(data);
}
});
</script>
獲得從不同的域或協議的數據提供給本地請求。
響應出現在內部,而實際數據來自外部源。
get_cross_domain。PHP (捲曲)
<?php
//initial output buffer
ob_start();
$ch = curl_init();
$options = array(
CURLOPT_URL => 'https://example.com/json_source.js',
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
curl_close($ch);
$json = $response;
//send nothing but the json response
ob_start();
header('Content-Type: application/json');
echo $json;
ob_flush();
//discard anything other than our json response.
while(ob_get_level > 0){
ob_end_clean();
}
exit;
捲曲方法,使您能夠選擇更多的控制,比如可以定義引薦,而忽略無效的CA公司等
get_cross_domain.php (包括)
<?php
//requires allow_url_include=1 in php.ini
ob_start();
include('https://example.com/json_source.js');
$json = ob_get_clean();
header('Content-Type: application/json');
echo $json;
exit;