用PHP做服務(wù)器轉(zhuǎn)發(fā)層,解決js的ajax跨域訪問問題

做js的ajax應(yīng)用時楞遏,會遇到你需要請求的接口并不在你當(dāng)前域下茬暇,此時就會出現(xiàn)跨域訪問的問題,瀏覽器會禁止你請求這個接口寡喝。

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

一個簡單的辦法就是在本域的服務(wù)器上预鬓,增加一個轉(zhuǎn)發(fā)層巧骚,將瀏覽器上過來的請求接收后赊颠,通過服務(wù)器將這個請求轉(zhuǎn)發(fā)到對應(yīng)的WebService上,然后把返回結(jié)果再取回后劈彪,送回js的請求頁面。

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

下面是我寫的一個php腳本痘括,可以完成這個轉(zhuǎn)發(fā)過程,僅供參考:

[php] view plain copy
<?php  
/** 
 * ajax業(yè)務(wù)處理中的接口轉(zhuǎn)發(fā)層滔吠,解決ajax跨域訪問的問題 
 *   工作原理:問請求通過本程序做中轉(zhuǎn),在本地服務(wù)器層完成與遠(yuǎn)程服務(wù)接口的交互 
 *   備注:使用時 URL_ROOT 這個參數(shù)需要根據(jù)你的目標(biāo)接口地址進(jìn)行修改疮绷,本轉(zhuǎn)發(fā)層之能用于單接口的Web Service接口服務(wù) 
 *        程序支持POST數(shù)據(jù)與GET數(shù)量的同時轉(zhuǎn)發(fā); 
 * @version 1.0.0.2 
 * */  
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)  
        {   //存在輸入數(shù)據(jù)  
            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數(shù)據(jù) 
     * @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數(shù)據(jù) 
     * @return bool 
     * */  
    private function getGET()  
    {  
        /*取得GET內(nèi)容*/  
        if (count($_GET) > 0)  
        {  
            $aTmp = array();  
            foreach ($_GET as $sKey => $sVal)  
                $aTmp[] = $sKey .'='. urlencode($sVal);  
            $this->msGets = implode('&', $aTmp);  
            return true;  
        }  
        else  
            return false;  
    }  
  
    /** 
     * 讀取遠(yuǎn)程接口返回的內(nèi)容 
     * @return string 
     * */  
    private function getContent($sGetUrl)  
    {  
/**/  
        $ch = curl_init();  
        curl_setopt ($ch, CURLOPT_URL, $sGetUrl); //設(shè)置GET的URL地址  
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);//將結(jié)果保存成字符串  
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);//連接超時時間s  
        curl_setopt ($ch, CURLOPT_TIMEOUT, 10);//執(zhí)行超時時間s  
        curl_setopt ($ch, CURLOPT_DNS_CACHE_TIMEOUT, 1800);//DNS解析緩存保存時間半小時  
        curl_setopt($ch, CURLOPT_HEADER,0);//丟掉頭信息  
        if (count($this->maGetPostData) > 0)  
        {   //存在POST數(shù)據(jù)需要提交  
            curl_setopt($ch, CURLOPT_POST, 1); //啟用POST數(shù)據(jù)  
            curl_setopt($ch, CURLOPT_POSTFIELDS, implode('', $this->maGetPostData));//提交POST數(shù)據(jù)  
        }  
        $sData = curl_exec($ch);  
        curl_close($ch);  
        unset($ch);  
        return $sData;  
    }  
}  
  
$o = new interface_relay();  
unset($o);  
?>  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冬骚,隨后出現(xiàn)的幾起案子椅贱,更是在濱河造成了極大的恐慌,老刑警劉巖只冻,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庇麦,死亡現(xiàn)場離奇詭異属愤,居然都是意外死亡女器,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門住诸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驾胆,“玉大人贱呐,你說我怎么就攤上這事丧诺。” “怎么了奄薇?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵驳阎,是天一觀的道長馁蒂。 經(jīng)常有香客問我呵晚,道長,這世上最難降的妖魔是什么沫屡? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任饵隙,我火速辦了婚禮沮脖,結(jié)果婚禮上金矛,老公的妹妹穿的比我還像新娘芯急。我一直安慰自己,他們只是感情好驶俊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饼酿,像睡著了一般榕酒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上故俐,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天奈应,我揣著相機(jī)與錄音购披,去河邊找鬼。 笑死肩榕,一個胖子當(dāng)著我的面吹牛刚陡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播株汉,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乔妈!你這毒婦竟也來了蝙云?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤路召,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后股淡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體身隐,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年唯灵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埠帕。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡垢揩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敛瓷,到底是詐尸還是另有隱情叁巨,我是刑警寧澤琐驴,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布俘种,位于F島的核電站秤标,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宙刘。R本人自食惡果不足惜苍姜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一悬包、第九天 我趴在偏房一處隱蔽的房頂上張望衙猪。 院中可真熱鬧,春花似錦布近、人聲如沸垫释。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至预伺,卻和暖如春订咸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酬诀。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞒御,地道東北人父叙。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像肴裙,于是被迫代替她去往敵國和親趾唱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361