深入跨域問題(4) - 利用代解解決跨域

閱讀目錄

深入跨域問題(1) - 初識 CORS 跨域資源共享舌劳;

深入跨域問題(2) - 利用 CORS 解決跨域

深入跨域問題(3) - 利用 JSONP 解決跨域

深入跨域問題(4) - 利用 代理服務(wù)器 解決跨域(本篇)

在上面的文章中帚湘,我們依此了解到,CORS 甚淡,JSONP 兩種方式實現(xiàn)跨域請求雷恃。

這兩種方法横蜒,都需要 前后端進行配合 才能夠正確地處理跨域問題探橱。 今天介紹一種方法,不需要前后端配合焙贷。

眾所周知,同源策略是瀏覽器需要遵循的標(biāo)準(zhǔn)建邓,重點是 瀏覽器 ,如果睁枕,是服務(wù)器是不是就不用遵守了呢 官边??外遇?

NODE 作為客戶端

這是注簿,我們的一個猜想,非瀏覽器之間跳仿,不用遵行同源策略诡渴,先來測試一下:

NODE 發(fā)送 POST 方法

客戶端:

const http = require('http');

const options = {
    hostname: '127.0.0.1',      // 注意這里不要添加 http 前綴
    port: 4000,     // 服務(wù)器端口號
    path: '/',      // 訪問路徑
    method: 'POST',
    headers: {
        'Content-Type': 'application/json;charset=utf-8',
    }
};

const request = http.request(options, (serverResponse) => {

    var body = '';

    serverResponse.on('data', (chunk) => {
        body += chunk;
    });

    serverResponse.on('end', () => {
        console.log('The data is ' + body);
    })

});

request.end();

你如果讀過,我之前的文章菲语,想必妄辩,您一定知道:

在瀏覽器中 POST 方法下 Content-Typeapplication/json; ,會觸發(fā) 預(yù)請求 (請看我之前的文章)山上。

服務(wù)器:

const http = require('http');

const data = { name: 'BruceLee', password: '123456' };

const server = http.createServer((request, response) => {

    if (request.url === '/') {
        response.end( JSON.stringify(data) );
    }
    
});


server.listen(4000, () => {
    console.log('The server is running at http://localhost:4000');
});

實驗結(jié)果:

image

測試結(jié)果表明眼耀,通過 NODE 發(fā)起請求可以避免 瀏覽器 的同源策略。

image

代理服務(wù)器

代理服務(wù)器佩憾,需要做以下幾個步驟:

  1. 接受客戶端 請求 哮伟。
  2. 請求 轉(zhuǎn)發(fā)給服務(wù)器。
  3. 拿到服務(wù)器 響應(yīng) 數(shù)據(jù)妄帘。
  4. 響應(yīng) 轉(zhuǎn)發(fā)給客戶端楞黄。

這是簡單的文字解析,下方為圖解流程:

image

這就是抡驼,代理服務(wù)器的工作機制(PS:畫的垃圾鬼廓,哈哈哈)。

實現(xiàn)代理服務(wù)器

在了解致盟,代理服務(wù)器的工作機制之后桑阶,下面我們將用 NODE 實現(xiàn)代理服務(wù)器。

客戶端:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Ajax測試</title>
</head>
     
<body>
    
    <script src="./node_modules/jquery/dist/jquery.min.js"></script>

    <script>
    var data = { name: 'BruceLee', password: '123456' };

    $.ajax({
        url: "http://localhost:3000",
        type: "post",
        data: JSON.stringify(data),
        contentType: 'application/json;charset=utf-8',
        success: function (result) {
            console.log(result);
        },
        error: function (msg) {
            console.log(msg);
        }
    })
    </script>
</body>

</html>

同樣勾邦,你可以換成蚣录,PUT,DELETE 等方法眷篇,進行測試萎河。

代理服務(wù)器:3000 端口

const http = require('http');

const server = http.createServer((request, response) => {
    
    // 代理服務(wù)器,直接和客戶端交互,也需要設(shè)置:CORS 跨域資源共享
    response.writeHead(200, {
        'Access-Control-Allow-Origin': '*',  // 設(shè)置 optins 方法允許所有服務(wù)器訪問 
        'Access-Control-Allow-Methods': '*',
        'Access-Control-Allow-Headers': 'Content-Type',
    });
    
    // 請求發(fā)送器
    const proxyRequest = http.request({
        host: '127.0.0.1',
        port: 4000,
        url: '/',
        method: request.method,
        headers: request.headers
    }, (serverResponse) => {
        
        // 截獲虐杯,服務(wù)器返回過來的數(shù)據(jù)玛歌。
        var body = '';

        serverResponse.on('data', (chunk) => {
            body += chunk;
        });

        serverResponse.on('end', () => {
            console.log('The data is ' + body );

            response.end(body);
        })

    }).end();

});

server.listen(3000, () => {
    console.log('The proxyServer is running at http://localhost:3000');
});

需要我們注意的是:代理服務(wù)器,也需要遵守 同源策略擎椰,

服務(wù)器:4000 端口

const http = require('http');

const data = { name: 'BruceLee', password: '123456' };

const server = http.createServer((request, response) => {

    if (request.url === '/') {
        response.end( JSON.stringify(data) );
    }

});
 
server.listen(4000, () => {
    console.log('The server is running at http://localhost:4000');
});

為了篇幅仍然較小支子,我采用了較為簡潔的代碼,你可以自己多試試 比如:PUT达舒,DELETE 方法值朋。

實驗結(jié)果:

image

成功避免了跨域請求。

實際上巩搏,現(xiàn)在昨登,已經(jīng)有很多實現(xiàn)代理服務(wù)器的插件了,你們可以自行百度贯底,這只是原理演示 7崂薄!禽捆!

參考與鳴謝

代理服務(wù)器是現(xiàn)代化的前端常用的手段笙什,另外還有反向代理,等等眾多方式實現(xiàn)跨域請求胚想。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末得湘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顿仇,更是在濱河造成了極大的恐慌淘正,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼闻,死亡現(xiàn)場離奇詭異鸿吆,居然都是意外死亡,警方通過查閱死者的電腦和手機述呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門惩淳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乓搬,你說我怎么就攤上這事思犁。” “怎么了进肯?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵激蹲,是天一觀的道長。 經(jīng)常有香客問我江掩,道長学辱,這世上最難降的妖魔是什么乘瓤? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮策泣,結(jié)果婚禮上衙傀,老公的妹妹穿的比我還像新娘。我一直安慰自己萨咕,他們只是感情好统抬,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著危队,像睡著了一般聪建。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上交掏,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天妆偏,我揣著相機與錄音刃鳄,去河邊找鬼盅弛。 笑死,一個胖子當(dāng)著我的面吹牛叔锐,可吹牛的內(nèi)容都是我干的挪鹏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼愉烙,長吁一口氣:“原來是場噩夢啊……” “哼讨盒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起步责,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤返顺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔓肯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂鹊,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年蔗包,在試婚紗的時候發(fā)現(xiàn)自己被綠了秉扑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡调限,死狀恐怖舟陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耻矮,我是刑警寧澤秦躯,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站裆装,受9級特大地震影響宦赠,放射性物質(zhì)發(fā)生泄漏陪毡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一勾扭、第九天 我趴在偏房一處隱蔽的房頂上張望毡琉。 院中可真熱鬧,春花似錦妙色、人聲如沸桅滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐谋。三九已至,卻和暖如春煌珊,著一層夾襖步出監(jiān)牢的瞬間号俐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工定庵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吏饿,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓蔬浙,卻偏偏與公主長得像猪落,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子畴博,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮笨忌,只允許與本...
    FLYSASA閱讀 1,729評論 0 6
  • 1. 什么是跨域 跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本俱病。它是由瀏覽器的同源策略造成的官疲,是瀏覽器對JavaScri...
    cbw100閱讀 6,341評論 2 86
  • <轉(zhuǎn)>詳解跨域(最全的解決方案) 什么是跨域跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本亮隙。它是由瀏覽器的同源策略造成的途凫,...
    涅槃快樂是金閱讀 4,758評論 0 3
  • 瀏覽器在請求不同域的資源時颖榜,會因為同源策略的影響請求不成功,這就是通常被提到的“跨域問題”煤裙。作為前端開發(fā)掩完,解決跨域...
    SCQ000閱讀 2,559評論 1 52
  • 世界第一名潛能激發(fā)大師安東尼·羅賓老師說: “這個世界上賺錢的行業(yè)有很多,沒有一項比支持他人生命成長來的更有意義”...
    天生贏家楊永剛閱讀 305評論 0 0