關於AJAX的跨域問題

最近過年的這幾天在作畢業設計的時候遇到了一個關於AJAX的跨域問題,原本我是想要用一下聚合數據平臺提供的天氣預報的接口的,而後作一個當地的天氣狀況展現,可是在使用AJAX的時候,被告知出現錯誤了。php

這是因爲瀏覽器的同源策略引發的,那麼什麼是同源策略呢,同源策略就是在不一樣域下請求另外一個頁面中的數據時,這是不被容許的。也就是會出現上面的問題。前端

那麼什麼是不一樣域呢。一個域名地址的組成有如下幾個部分:協議、子域名、主域名、端口號、請求資源地址。ajax

例如:http://www.abc.com:8080/server.php/這個域名地址。json

這裏的http://就是協議。跨域

www就是子域名瀏覽器

abc.com就是主域名服務器

8080就是端口號app

server.php就是請求資源地址curl

只要以上的協議、子域名、主域名、端口號有一個不一樣,就算作不一樣域。不一樣域之間的互相請求資源就是跨域請求。那麼怎麼來解決這個跨域問題呢?,這裏我收集了三個方法,分別是利用代理、jsonp、xhr2。jsonp

一、使用代理:由於我這裏使用的後臺語言是php,因此我這裏就只是找到了php相關的代碼。

<?php
    header('Content-type:application/json;charset=utf-8');
    function GetCurl($url){
        $curl = curl_init();
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($curl,CURLOPT_URL, $url);
        curl_setopt($curl,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        $resp = curl_exec($curl);
        curl_close($curl);
        return $resp;
    }
    $resp = GetCurl("http://op.juhe.cn/onebox/weather/query?cityname=成都&key=ecf1aeb200fe2eb300a68a4e5a1a0d46");
    $resp = json_decode($resp,true);
    echo json_encode($resp);
?>

二、使用jsonp,說道jsonp就不得不說下json了,他是一種輕量級的數據交換格式,它採用了徹底獨立於語言的文本格式,也就是說不管是任何語言均可以解析json數據,只要按照json的規則來就行。那麼json的大概的結構以下:

{
    "user": [{
        "name": "張三",
        "age": 20,
        "sex": "male"
    }, {
        "name": "李四",
        "age": 25,
        "sex": "male"
    }, {
        "name": "翠花",
        "age": 18,
        "sex": "female"
    }]
}

那麼什麼是jsonp呢,jsonp是一種json的使用模式,他就是爲了解決各大主流瀏覽器之間的跨域問題而出現的,使用jsonp所抓取的並非json,而是任意的JavaScript代碼,而後利用JavaScript直譯器執行而不是利用json解析器解析。

$.ajax({
            type:'GET',
            url:"http://op.juhe.cn/onebox/weather/query?cityname=成都&key=ecf1aeb200fe2eb300a68a4e5a1a0d46",
            dataType:'jsonp',
            jsonp:'callback',
            success:function(data){
                console.log(data);
            }
        });

三、使用xhr2,這裏的xhr2是HTML5提出的新功能,XMLHttPRequest Level2已經實現了各大瀏覽器之間的跨域問題、可是在IE10如下的版本都不被支持。使用這個方法解決跨域問題很簡單,只須要在服務器頁面添加兩行代碼就OK。

後臺php代碼:

<?php
header('Content-type:application/json;charset=utf-8');
header('Access-Control-Allow-Origin:*');//這裏的*表示全部的域均可以訪問。這下面兩句就是須要在服務器頁面添加的代碼。
header('Access-Control-Allow-Methods:POST,GET');
$arr=array(
    array('name'=>'張三','age'=>24,'sex'=>'male'),
    array('name'=>'李四','age'=>22,'sex'=>'male'),
    array('name'=>'翠花','age'=>20,'sex'=>'female')
);
echo json_encode($arr);
?>

前端代碼:

$.get('http://127.0.0.1/AJAX/xhr2.php',function(data){
    console.log(data);
});

瀏覽器控制檯輸出結果:

好了以上就是我找到的解決ajax跨域問題的方法,今天就先寫到這裏。

相關文章
相關標籤/搜索