1. 程式人生 > >跨域處理實踐

跨域處理實踐

policy 解決辦法 blank get com 技術 quest 詳細 ont

  關於跨域的解決辦法網上很多方法,之前自己也認真考究過,測試過jsonp的實現原理,看過jquery源碼中封裝的$.ajax()部分內容,在此只是記錄自己在項目中處理過跨域的問題。想看更加詳細的可以看看《瀏覽器同源政策及其規避方法》。


問題1
  本地開發環境想通過$ajax()獲取測試環境的數據,因為本地和開發域名不一樣,受到同源策略限制,不能獲取測試環境數據。

解決:
在php的控制器中加上header("Access-Control-Allow-Origin");可以拿到測試環境數據。OK。

問題2:

請求不同資源下的資源。

解決:

使用jsonp,在$.ajax(),添加dataType字段。

技術分享

php代碼

//兼容觸屏跨域請求
        $jsonpCallback = Yii::app()->request->getParam(‘callback‘);

        if($jsonpCallback){
            
            if(!$result){
                echo $jsonpCallback.‘({errno: 101, msg: "101 ‘. ErrorApi::$errMsg .‘"})‘;
                exit();
            }

            if( !isset($result[‘prizeId‘]) ){
                echo $jsonpCallback.‘({errno: 100, data: ‘. json_encode($result) .‘})‘;
            }else{
                echo $jsonpCallback.‘({errno: 0, data: ‘. json_encode($result) .‘})‘;
            }
            exit();
        }

  

jsonp註意:

1、callback和jsonpCallback是jquery源碼中默認使用的,也可以自己修改。
2、jsonp只有GET請求,這是由於 script 標簽自身的限制決定的。jQuery源碼中,POST請求也會轉換為GET請求。

3、不能很好的發現錯誤,並進行處理。與 Ajax 對比,由於不是通過 XmlHttpRequest 進行傳輸,所以不能註冊 success、 error 等事件監聽函數。

跨域處理實踐