摘要:技术的学习也是如此唯有实践才能更清楚的明白原理和加深印象,因此本文会利用对前端的各种跨域方式进行实践,强烈建议一步一步跟着做,相信你肯定会对跨域有更深层次的理解。
前言
常言道,"读万卷书,不如行万里路"。技术的学习也是如此,唯有实践才能更清楚的明白原理和加深印象,因此本文会利用node.js对前端的各种跨域方式进行实践,强烈建议一步一步跟着做,相信你肯定会对跨域有更深层次的理解。而由于篇幅限制,本文只会贴出关键性的代码,本系列总共分为上下篇。具体的代码请移步我的Github。如果对你有帮助的话,欢迎 star ヾ(´・ω・`)ノ
接上文--->「跨域」利用node.js实践前端各种跨域方式(上)
六、window.postMessagepostMessage是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
<span class="javascript">a</span>
在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 protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很好的实现。
原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。
首先,我们创建一个客户端的html页面。
目录:webSocket/public/index.html
<span class="hljs-keyword">index</span>
用户输入:
将这个页面部署在3333端口上。
目录:webSocket/client.js
</>code
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
</>code
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就最好啦!=(//▽//)感谢大家~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95430.html
摘要:如果对你有帮助的话,欢迎一跨域首先我们在本地起一个服务器,用于接收客户端的请求并作出回应。五跨域原理域想和域通信,通过中间页面。即借助接收到了发来的消息,并给予回应跨域成功接下文跨域利用实践前端各种跨域方式下 前言 常言道,读万卷书,不如行万里路。技术的学习也是如此,唯有实践才能更清楚的明白原理和加深印象,因此本文会利用node.js对前端的各种跨域方式进行实践,强烈建议一步一步跟着做...
摘要:如果对你有帮助的话,欢迎一跨域首先我们在本地起一个服务器,用于接收客户端的请求并作出回应。五跨域原理域想和域通信,通过中间页面。即借助接收到了发来的消息,并给予回应跨域成功接下文跨域利用实践前端各种跨域方式下 前言 常言道,读万卷书,不如行万里路。技术的学习也是如此,唯有实践才能更清楚的明白原理和加深印象,因此本文会利用node.js对前端的各种跨域方式进行实践,强烈建议一步一步跟着做...
摘要:同源策略所谓同源是指协议,域名,端口均相同。同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。需注意的是由于同源策略的限制,所读取的为跨域请求接口所在域的,而非当前页。 一、什么是跨域 1.URL解析 URL (Uniform Resource Locator )统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的...
摘要:用函数式编程对进行断舍离当从业的老司机学会函数式编程时,他扔掉了的特性,也不用面向对象了,最后发现了真爱啊作用域和闭包作用域和闭包在里非常重要。旨在帮助非函数式编程的同学,能快速切入到函数式编程的理念。 1、用函数式编程对JavaScript进行断舍离 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! https:/...
阅读 2850·2021-11-23 09:51
阅读 2150·2021-10-13 09:40
阅读 1569·2021-09-30 10:01
阅读 690·2021-09-26 09:46
阅读 2400·2021-09-23 11:55
阅读 1575·2021-09-10 10:51
阅读 2470·2021-09-09 09:33
阅读 2313·2019-08-29 17:25