国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

「跨域」利用node.js實踐前端各種跨域方式(下)

Jenny_Tong / 1859人閱讀

摘要:技術的學習也是如此唯有實踐才能更清楚的明白原理和加深印象,因此本文會利用對前端的各種跨域方式進行實踐,強烈建議一步一步跟著做,相信你肯定會對跨域有更深層次的理解。

前言

常言道,"讀萬卷書,不如行萬里路"。技術的學習也是如此,唯有實踐才能更清楚的明白原理和加深印象,因此本文會利用node.js對前端的各種跨域方式進行實踐,強烈建議一步一步跟著做,相信你肯定會對跨域有更深層次的理解。而由于篇幅限制,本文只會貼出關鍵性的代碼,本系列總共分為上下篇。具體的代碼請移步我的Github。如果對你有幫助的話,歡迎 star ヾ(′?ω?`)?

接上文--->「跨域」利用node.js實踐前端各種跨域方式(上)

六、window.postMessage

postMessage是HTML5 XMLHttpRequest Level 2中的API,且是為數不多可以跨域操作的window屬性之一,它可用于解決以下方面的問題:

1.頁面和其打開的新窗口的數據傳遞
2.多窗口之間消息傳遞
3.頁面與嵌套的iframe消息傳遞
4.上面三個場景的跨域數據傳遞

用法:postMessage(data,origin)方法接受兩個參數
data: html5規范支持任意基本類型或可復制的對象,但部分瀏覽器只支持字符串,所以傳參時最好用JSON.stringify()序列化。
origin: 協議+主機+端口號,也可以設置為"*",表示可以傳遞給任意窗口,如果要指定和當前窗口同源的話設置為"/"。

來,我們來用node.js實踐一下~

目錄:postMessage/public/a.html




    
    
    
    a
    


    

在iframe加載完成后,向b.html所在域發送數據。因為postMessage是綁定在window對象上的,所以我們要獲取iframe.contentWindow再發送數據,同時監聽message,觀察b.html有沒有回傳數據給我們。現在分別跑兩個服務。訪問localhost:3333可以看到:

b.html接收到a.html發送過去的數據啦~

然后a.html也收到了b.html回傳的數據了。

跨域成功~ ( ?? ??)?

七、nginx 反向代理

這個方案的原理圖如下:

說明:當A域想與B域通信,可以通過nginx的反向代理,首先A域與同域的nginx服務器通信,然后nginx將請求轉發到另外一個服務器,因為服務器之間的通信不存在跨域,這樣我們就完成了跨域。具體實現如下:

首先,如果本地沒有安裝nginx的,需要安裝nginx。安裝完成后,我們對nginx進行配置:

目錄:nginx-1.14.0/conf/nginx.conf

    server {
        listen       1111;
        server_name  localhost;

        location / {
            proxy_pass http://localhost:9999/; #反向代理到9999端口
            index  index.html index.htm;
            default_type "text/html";
            alias  "D:/Github/node-server/nginx/public/"; #client.html所在的本地的地址

            add_header Access_Control_Allow_Origin http://localhost:1111; 
            add_header Access_Control_Allow_Credentials true; #允許客戶端帶cookie訪問
        }

然后,我們配置9999端口的服務器

目錄:nginx/server.js

const http = require("http");
const server = http.createServer();
const qs = require("querystring");

server.on("request", function(req, res) {
    const query = require("url").parse(req.url, true).query;

    //向前臺寫cookie
    res.writeHead(200, {
        "Set-Cookie" : "name=jchermy;Path:/;Domain:localhost;Httponly" //HttpOnly 腳本無法讀取
    });
   
    res.write(JSON.stringify("Hi! "+query.user));
    res.end();
})

server.listen("9999");
console.log("Server is running at port 9999 .....");

這時候,我們打開瀏覽器,訪問 http://localhost:1111/client.html?user=jchermy,看到下面的頁面:

我們在1111端口,將user=jchermy傳給9999端口,然后9999端口接收到了我們的發送的信息并回傳了"Hi! jchermy".說明這兩個url可以跨域相互通信!完成~

七、node.js 中間件跨域

這個方案與nginx反向代理十分類似,只是將nginx代理服務器換成了node服務器。

目錄:node-middleware/proxyserver.js

const express = require("express");
const proxy = require("http-proxy-middleware");
const app = express();

app.use("/login", proxy({
    //代理跨域的目標接口
    target: "http://localhost:5555",
    changeOrigin: true,
    //修改響應頭信息,實現跨域,并允許帶cookie
    onProxyRes: function(proxyRes, req, res) {
        res.header("Access-Control-Allow-Origin", "http://localhost");
        res.header("Access-Control-Allow-Credentials", "true");
    },

    //修改響應信息中的cookie域名
    cookieDomainRewrite: "http://localhost"
}));

app.use(express.static( "./public"));
app.listen(3333);
console.log("proxy server is listen at port 3333");

目錄:node-middleware/server.js

const http = require("http");
const server = new http.Server();
const qs = require("querystring");

server.on("request", function(request, response) {
    const query = require("url").parse(request.url, true).query;
    response.writeHead(200, {
        "Set-Cookie": "name=amiee;Path:/;Domain:localhost:3333;Httponly"
    });

    response.write(`Hi, ${query.name} ! I come from localhost:5555`);
    response.end();
})

server.listen("5555");
console.log("Server is running at port 5555 .....")

最后,訪問http://localhost:3333/login?name=hahah,可以看到:

八、webSocket

WebSocket protocol是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信,同時允許跨域通訊,是server push技術的一種很好的實現。
原生WebSocket API使用起來不太方便,我們使用Socket.io,它很好地封裝了webSocket接口,提供了更簡單、靈活的接口,也對不支持webSocket的瀏覽器提供了向下兼容。

首先,我們創建一個客戶端的html頁面。

目錄:webSocket/public/index.html




    
    
    
    index


    
用戶輸入:

將這個頁面部署在3333端口上。

目錄:webSocket/client.js

const express = require("express");
const app = express();

app.use(express.static("./public"));
app.listen(3333);
console.log("client is running at port 3333....");

最后,創建一個服務器,接收客戶端的請求,并給予返回值

目錄: webSocket/server.js

const http = require("http");
const socket = require("socket.io");
 
//啟動http服務
const server = http.createServer(function(req, res) {
    res.writeHead(200, {
        "Content-type": "text/html"
    });
    res.end();
})

server.listen(5555);
console.log("server is running at port 5555");

const io = socket(server);
//監聽socket連接
io.on("connection", function (client) {
    //接收消息
    client.on("message", function (msg) {
        io.emit("message",  `hello, ${msg}`);
        console.log("data from client --->" + msg);
      });

      //斷開處理
      client.on("disconnect", function() {
          console.log("Client socket has closed");
      });
});

將客戶端和服務器端都跑起來,輸入一些字符,當鼠標失去焦點后可以在服務器端5555端口的控制臺看到:

這說明服務器已經收到了客戶端發送過去的字符。

此時在打開客戶端頁面的控制臺,可以看到客戶端也收到了服務器返回的字符:

結語

這個系列終于寫完啦,還是那句話,有錯誤和不合理的地方歡迎大家指正!如果文章對你有幫助的話,歡迎點贊收藏!!Github給個star就最好啦!=(//▽//)感謝大家~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95430.html

相關文章

  • 跨域利用node.js實踐前端各種跨域方式(上)

    摘要:如果對你有幫助的話,歡迎一跨域首先我們在本地起一個服務器,用于接收客戶端的請求并作出回應。五跨域原理域想和域通信,通過中間頁面。即借助接收到了發來的消息,并給予回應跨域成功接下文跨域利用實踐前端各種跨域方式下 前言 常言道,讀萬卷書,不如行萬里路。技術的學習也是如此,唯有實踐才能更清楚的明白原理和加深印象,因此本文會利用node.js對前端的各種跨域方式進行實踐,強烈建議一步一步跟著做...

    Lavender 評論0 收藏0
  • 跨域利用node.js實踐前端各種跨域方式(上)

    摘要:如果對你有幫助的話,歡迎一跨域首先我們在本地起一個服務器,用于接收客戶端的請求并作出回應。五跨域原理域想和域通信,通過中間頁面。即借助接收到了發來的消息,并給予回應跨域成功接下文跨域利用實踐前端各種跨域方式下 前言 常言道,讀萬卷書,不如行萬里路。技術的學習也是如此,唯有實踐才能更清楚的明白原理和加深印象,因此本文會利用node.js對前端的各種跨域方式進行實踐,強烈建議一步一步跟著做...

    jaysun 評論0 收藏0
  • 前端相關大雜燴

    摘要:希望幫助更多的前端愛好者學習。前端開發者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實踐譯者張捷滬江前端開發工程師當你問起有關與時,老司機們首先就會告訴你其實是個沒有網絡請求功能的庫。 前端基礎面試題(JS部分) 前端基礎面試題(JS部分) 學習 React.js 比你想象的要簡單 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 評論0 收藏0
  • 大話javascript 5期:跨域

    摘要:同源策略所謂同源是指協議,域名,端口均相同。同源策略是瀏覽器的一個安全功能,不同源的客戶端腳本在沒有明確授權的情況下,不能讀寫對方資源。需注意的是由于同源策略的限制,所讀取的為跨域請求接口所在域的,而非當前頁。 一、什么是跨域 1.URL解析 URL (Uniform Resource Locator )統一資源定位符(URL)是用于完整地描述Internet上網頁和其他資源的地址的...

    jzzlee 評論0 收藏0
  • 20170917 前端開發周報:JavaScript函數式編程、作用域和閉包

    摘要:用函數式編程對進行斷舍離當從業的老司機學會函數式編程時,他扔掉了的特性,也不用面向對象了,最后發現了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數式編程的同學,能快速切入到函數式編程的理念。 1、用函數式編程對JavaScript進行斷舍離 當從業20的JavaScript老司機學會函數式編程時,他扔掉了90%的特性,也不用面向對象了,最后發現了真愛啊!!! https:/...

    tomener 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<