跨域處理實踐
阿新 • • 發佈:2017-06-12
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 等事件監聽函數。
跨域處理實踐