程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用PHP做服務器轉發層,解決js的ajax跨域訪問問題

用PHP做服務器轉發層,解決js的ajax跨域訪問問題

編輯:關於PHP編程

做js的ajax應用時,會遇到你需要請求的接口並不在你當前域下,此時就會出現跨域訪問的問題,浏覽器會禁止你請求這個接口。

此時怎麼訪問這個WebService的接口呢?

一個簡單的辦法就是在本域的服務器上,增加一個轉發層,將浏覽器上過來的請求接收後,通過服務器將這個請求轉發到對應的WebService上,然後把返回結果再取回後,送回js的請求頁面。

一般而言這個是解決跨域訪問最安全與最具兼容性的辦法。

下面是我寫的一個php腳本,可以完成這個轉發過程,僅供參考:

[php]
<?php 
/**
 * ajax業務處理中的接口轉發層,解決ajax跨域訪問的問題
 *   工作原理:問請求通過本程序做中轉,在本地服務器層完成與遠程服務接口的交互
 *   備注:使用時 URL_ROOT 這個參數需要根據你的目標接口地址進行修改,本轉發層之能用於單接口的Web Service接口服務
 *        程序支持POST數據與GET數量的同時轉發;
 * @version 1.0.0.2
 * @author JerryLi [email protected]
 * @copyright b.dzs.mobi 2012-11-16
 * */ 
class interface_relay 

    /**接口根地址(此處是需要修改的地方)*/ 
    const URL_ROOT = 'http://api.air-id.net/InterFace/'; 
    /**字符集*/ 
    const CHARSET = 'UTF-8'; 
    /**GET*/ 
    private $msGets = ''; 
    /**POST*/ 
    private $maGetPostData = array(); 
 
    function __construct() 
    { 
        $this->getPOST(); 
        $this->getGET(); 
        if($this->msGets != '' || count($this->maGetPostData) > 0) 
        {   //存在輸入數據 
            if(count($this->msGets) > 0) 
                $sUrl = self::URL_ROOT .'?'. $this->msGets; 
            else 
                $sUrl = self::URL_ROOT; 
            header('Content-Type: text/html; charset='. self::CHARSET); 
            echo $this->getContent($sUrl); 
        } 
        else 
        { 
            header('Content-Type: text/html; charset='. self::CHARSET); 
            echo $this->getContent(self::URL_ROOT); 
        } 
    } 
 
    function __destruct() 
    { 
        unset($maGetPostData, $msGets); 
    } 
 
    /**
     * 載入POST數據
     * @return bool
     * */ 
    private function getPOST() 
    { 
        $handle = @fopen('php://input', 'r'); 
        $data = ''; 
        do 
        { 
            $data = @fread($handle, 1024); 
            if (strlen($data) == 0) 
                break; 
            else 
                $this->maGetPostData[] = $data; 
        }while(true); 
        fclose($handle); 
        unset($data, $handle); 
        return count($this->maGetPostData) >= 1; 
    } 
 
    /**
     * 載入GET數據
     * @return bool
     * */ 
    private function getGET() 
    {  www.2cto.com
        /*取得GET內容*/ 
        if (count($_GET) > 0) 
        { 
            $aTmp = array(); 
            foreach ($_GET as $sKey => $sVal) 
                $aTmp[] = $sKey .'='. urlencode($sVal); 
            $this->msGets = implode('&', $aTmp); 
            return true; 
        } 
        else 
            return false; 
    } 
 
    /**
     * 讀取遠程接口返回的內容
     * @return string
     * */ 
    private function getContent($sGetUrl) 
    { 
/**/ 
        $ch = curl_init(); 
        curl_setopt ($ch, CURLOPT_URL, $sGetUrl); //設置GET的URL地址 
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);//將結果保存成字符串 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);//連接超時時間s 
        curl_setopt ($ch, CURLOPT_TIMEOUT, 10);//執行超時時間s 
        curl_setopt ($ch, CURLOPT_DNS_CACHE_TIMEOUT, 1800);//DNS解析緩存保存時間半小時 
        curl_setopt($ch, CURLOPT_HEADER,0);//丟掉頭信息 
        if (count($this->maGetPostData) > 0) 
        {   //存在POST數據需要提交 
            curl_setopt($ch, CURLOPT_POST, 1); //啟用POST數據 
            curl_setopt($ch, CURLOPT_POSTFIELDS, implode('', $this->maGetPostData));//提交POST數據 
        } 
        $sData = curl_exec($ch); 
        curl_close($ch); 
        unset($ch); 
        return $sData; 
    } 

 
$o = new interface_relay(); 
unset($o); 
?> 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved