终结同源策略!轻松实现跨域访问的9种方式!

2023-06-27 0 1,038

终结同源策略!轻松实现跨域访问的9种方式!

布吕马指的是在Web应用程序中,两个公交站点的JAVA企图向另两个公交站点的JAVA发动HTTP允诺,此种允诺是虽然应用程序严格遵守相混思路(Same-Origin Policy)而被婉拒的。为的是化解那个难题,他们能采用下列9种形式:

1. JSONP:透过谢利谢<script>条码向其它域允诺统计数据,并将统计数据做为反弹表达式HTA回去。

当须要在两个页面中出访另两个搜索引擎下的统计数据时,虽然应用程序的相混思路会制止此种出访,因而就需要采用JSONP来同时实现布吕马统计数据的出访。

JSONP(JSON with Padding)是一类同时实现布吕马互联网统计传输的控制技术,它借助了<script>条码的布吕马出访优点。

采用JSONP的基本上操作过程如下表所示:

在客户端标识符中表述两个自上而下的反弹表达式,用作转交服务器返回的统计数据。构筑两个谢利谢

实例标识符如下表所示:

function jsonpRequest(url, callback) { // 建立<script>条码 varscript =document.createElement(script); // 构筑URL门牌号,选定反弹表达式中文名称 var callbackName = jsonp_callback_ + Math.floor(Math.random() * 100000); url += &callback= + callbackName; // 在window对象上表述反弹表达式 window[callbackName] =function(data) { // 处理服务器返回统计数据 callback(data); // 删除反弹表达式 delete window[callbackName]; // 移除<script>条码 document.body.removeChild(script); }; // 设置<script>条码的src属性 script.src = url; // 添加<script>条码到<body>元素中 document.body.appendChild(script); }

透过调用那个jsonpRequest表达式,他们能布吕马允诺统计数据,并将统计数据传递给反弹表达式进行处理。

2. CORS:在服务器端设置响应头信息,允许布吕马出访。

CORS(Cross-Origin Resource Sharing)是一类允许布吕马出访资源的机制,它透过在服务器端设置响应头信息来允许布吕马出访。

采用CORS的基本上操作过程如下表所示:

在服务器端设置响应头信息,允许选定的布吕马允诺出访资源。透过设置Access-Control-Allow-Origin头信息,选定允许出访的源,比如设置为”*”表示允许任意源出访。应用程序在发送布吕马允诺时,会在允诺头中添加Origin头信息,那个头信息指示了允诺的源门牌号。服务器在转交到允诺后,会根据Origin头信息,在响应头中添加Access-Control-Allow-Origin头信息,以表明该源门牌号被允许出访。

实例标识符如下表所示:

// 采用Node.js的Express框架同时实现CORS布吕马出访 const express = require(express); constapp = express();// 设置允许布吕马出访的资源 app.use((req, res, next) => { // 设置允许布吕马的源 res.setHeader(Access-Control-Allow-Origin, *); // 设置允许布吕马的允诺头 res.setHeader(Access-Control-Allow-Headers, origin, content-type, accept); // 设置允许布吕马的允诺方法res.setHeader(Access-Control-Allow-Methods, GET, POST, PUT, DELETE); // 继续处理允诺 next(); }); // 处理API允诺app.get(/api, (req, res) => { // 返回JSON统计数据 res.json({ code: 0, message: success, data: { name:JSONP, description: 采用JSONP同时实现布吕马统计数据出访 } }); }); // 启动服务器 app.listen(3000, () => { console.log(Server is running on port 3000); });

在那个实例标识符中,他们采用了Node.js的Express框架同时实现了两个简单的API,该API允许布吕马出访,透过设置响应头信息,选定了允许布吕马允诺出访的源、允诺头和允诺方法。应用程序标识符能采用XMLHttpRequest或Fetch API来出访该API,并获得返回的JSON统计数据。

3. WebSocket:采用全双工通信方式,无需提前建立HTTP连接,能布吕马通讯。

WebSocket是一类基于TCP协议同时实现的全双工通信协议,它采用了一类类似HTTP的握手机制,在建立连接后,双方能进行自由的统计传输,能布吕马通信,无需提前建立HTTP连接。

采用WebSocket的基本上操作过程如下表所示:

应用程序透过WebSocket对象建立WebSocket连接,选定WebSocket服务端的门牌号。WebSocket服务端转交到连接允诺后,进行握手处理,并建立起连接。在握手时,服务端会告知应用程序是否支持WebSocket协议。如果握手成功,应用程序和服务端就能进行双向统计传输,应用程序和服务端均可发送和转交统计数据。

实例标识符如下表所示:

// 建立WebSocket连接 var socket = new WebSocket(ws://localhost:8080); // 连接成功时,打印日志信息 socket.onopen = function() { console.log(WebSocket connection is opened.); }; // 转交到消息时,打印消息内容 socket.onmessage = function(event) { console.log(WebSocket received message:, event.data); }; // 连接关闭时,打印日志信息 socket.onclose = function() { console.log(WebSocket connection is closed.); }; // 发送消息 socket.send(Hello WebSocket!);

在那个实例中,他们采用WebSocket对象建立了两个WebSocket连接,并选定了WebSocket服务端的门牌号,然后透过事件监听表达式来处理连接状态、转交消息和发送消息。应用程序和服务端之间能发送和转交统计数据,同时实现实时通信的功能。虽然WebSocket协议采用了类似HTTP的握手机制,所以WebSocket能布吕马通信,无需提前建立HTTP连接。

4.postMessage:HTML5提供了两个专门用作跨文档通信的API,能布吕马通信。

HTML5提供了两个专门用作跨文档通信的API——postMessagepostMessage方法能在不同的窗口(或文档)之间传递统计数据,包括字符串和对象等统计数据类型,能同时实现布吕马通信。

采用postMessage的基本上操作过程如下表所示:

在发送消息的窗口中,采用postMessage方法向选定的窗口发送消息,选定窗口的origin属性(协议、搜索引擎、端口号)以便转交窗口验证消息是否来自信任的源。在转交消息的窗口中,透过添加message事件监听表达式来接受消息,事件对象包含了发送窗口的信息、消息统计数据等。

实例标识符如下表所示:

// 发送消息 var sendMessage = { type: text, content: Hello, postMessage! }; var targetWindow = window.opener; var targetOrigin = *; targetWindow.postMessage(sendMessage, targetOrigin);// 转交消息 window.addEventListener(message, function(event) { if(event.origin !==http://example.com) { return; } console.log(event.data); }, false);

在那个实例中,他们在发送消息的窗口中,采用postMessage方法向选定的窗口发送消息,选定了转交窗口的origin,以保证消息来自可信任的源。在转交消息的窗口中,添加message事件监听表达式来转交消息,透过验证消息来自可信任的源,然后使

5. 代理服务器:透过在服务器端代理允诺,将布吕马允诺转到同一服务器,再返回到允诺端。

代理服务器是指在服务器端转发允诺和响应的中间层服务器,它能

采用代理服务器同时实现布吕马允诺的基本上操作过程如下表所示:

应用程序向代理服务器发送允诺。代理服务器转交到允诺后,将请代理服务器将响应返回给应用程序,完成布吕马允诺。

实例标识符如下表所示:

// 在Node.js中采用http-proxy中间件同时实现代理服务器 const http = require(http); const httpProxy = require(http-proxy); // 建立代理服务器 const proxy = httpProxy.createProxyServer({}); // 处理请求 const server = http.createServer((req, res) => { console.log(Proxy request:, req.url); // 设置响应头,允许布吕马出访res.setHeader(Access-Control-Allow-Origin, *); res.setHeader(Access-Control-Allow-Headers, origin, content-type, accept); // 如果是API允诺,将允诺转发到目标服务器 if (req.url.startsWith(/api)) { proxy.web(req, res, { target:http://localhost:3000 }); } else { res.end(); } }); // 监听端口,启动服务器server.listen(8000, () => { console.log(Server is running on port 8000); });

在那个实例中,他们采用Node.js自带的http模块建立了两个HTTP服务器,透过设置响应头信息,同时实现了允许布吕马出访。在处理允诺时,他们透过判断允诺URL,将API允诺转发到目标服务器,采用http-proxy中间件同时实现了代理服务器的功能,将允诺转发到同一服务器上,再将响应返回给应用程序,从而同时实现了布吕马允诺的目的。

6. nginx反向代理:借助nginx的反向代理优点来同时实现布吕马。

Nginx是一款高性能的Web服务器和反向代理服务器,透过配置nginx的反向代理功能,能化解布吕马难题。

采用nginx反向代理同时实现布吕马允诺的基本上步骤如下表所示:

安装nginx,并编辑配置文件。在nginx配置文件中,采用location指令匹配须要代理的URL,并设置代理服务器的门牌号和端口号。重启nginx,使配置文件生效。

实例标识符如下表所示:

# 将允诺 /api/ 转发到 http://localhost:3000/ location /api/ { # 设置允许布吕马出访 add_header Access-Control-Allow-Origin *; # 设置须要代理的目标服务器 proxy_pass http://localhost:3000/; }

在那个实例中,他们采用nginx反向代理功能,将允诺URL为/api/的允诺转发到http://localhost:3000/服务器,同时实现了布吕马允诺。同时,他们在nginx配置文件中设置了

Access-Control-Allow-Origin头信息,允许布吕马出访,从而同时实现了布吕马通信的目的。

7. iframe嵌套:借助iframe的布吕马通信优点,在不同的iframe之间同时实现统计数据交换。

iframe是HTML中的两个重要元素,能在两个页面中嵌入另两个页面或文档。iframe具有出访不同搜索引擎页面的能力,因而能在不同iframe之间同时实现布吕马通信。

采用iframe嵌套同时实现布吕马通信的基本上操作过程如下表所示:

在主页面中表述两个iframe元素,并设置src属性为布吕马页面的URL。在主页面中,透过监听message事件来转交来自iframe的消息。

实例标识符如下:

在主页面嵌入iframe:

<!DOCTYPE html> <html> <head> <meta charset=“UTF-8”> <title>主页面</title> </head> <body> <h1>主页面</h1> <iframe src=“http://example.com/iframe.html”></iframe> <script> // 监听消息事件,转交来自iframe的消息 window.addEventListener(message, function(event) { console.log(event.data); }, false); </script> </body> </html>

在布吕马页面发送消息:

<!DOCTYPE html> <html> <head> <meta charset=“UTF-8”> <title>布吕马页面</title> <script> // 发送消息给主页面 window.parent.postMessage(Hello, parent window!, *); </script> </head> <body> <h1>布吕马页面</h1> </body> </html>

在那个实例中,他们在主页面中嵌入了两个布吕马的iframe,并监听message事件来转交来自iframe的消息。在布吕马的iframe中,透过window.parent.postMessage()方法发送消息给主页面,*表示不限制发送消息的搜索引擎,转交哪个窗口也是如此。

采用iframe嵌套同时实现布吕马通信时,须要注意的是,须要确保主页面和iframe页面的信任关系,避免信息泄露和CSRF攻击。

8. Document.domain:在同两个父搜索引擎下的不同子搜索引擎之间,透过设置document.domain来同时实现布吕马出访。

在同两个父搜索引擎下的不同子搜索引擎之间进行布吕马操作时,虽然应用程序的相混思路,会限制JS标识符的出访权限,为的是化解那个难题,能在父搜索引擎相同的情况下,透过设置document.domain来同时实现布吕马出访。

具体同时实现形式是,在不同的子搜索引擎中,将document.domain设置为相同的父搜索引擎,如将子搜索引擎A.domain.com和子搜索引擎B.domain.com中的document.domain都设置为domain.com。这样,这两个子搜索引擎就能透过JS标识符来共享cookie、iframe等资源了。

须要注意的是,document.domain只能设置为包含它的域,例如,它能设置为domain.com或sub.domain.com,但不能设置为otherdomain.com。并且,不同子搜索引擎之间的跨域操作仅适用作协议、端口号相同的情况。

下面是两个简单的JS标识符实例:

假设当前页面的URL是

https://sub1.example.com/index.html,想要在同域下的

https://sub2.example.com/other.html页面中,出访当前页面的cookie。在当前页面(https://sub1.example.com/index.html)中,设置document.domain:document.domain = example.com; 在同域下的另两个页面(https://sub2.example.com/other.html)中,透过JS标识符来出访当前页面的cookie: var cookies = document.cookie; console.log(cookies);

透过将两个页面的document.domain设置为相同的父搜索引擎,使得它们处于同两个域中,从而同时实现了布吕马出访。

9. 布吕马资源共享(CORS)标准:CORS机制透过一些特定的HTTP头部来告诉应用程序,哪些布吕马允诺是能被允许的,从而同时实现布吕马统计数据出访。

CORS(Cross-origin Resource Sharing)是两个W3C标准,用作化解透过HTTP进行布吕马出访的难题

CORS机制允许服务器向应用程序发送附加HTTP头,告诉应用程序哪些布吕马允诺是被允许的。

具体来说,当应用程序向布吕马服务器允诺统计数据时,服务器能在响应头部中加入Access-Control-Allow-Origin字段。例如,如果A搜索引擎的页面向B搜索引擎的服务器允诺资源,B服务器能在响应头中添加下列字段:

Access-Control-Allow-Origin: https://A-domain.com

那个字段告诉应用程序A搜索引擎下的页面能布吕马出访B搜索引擎服务器的资源。如果没有设置那个字段,布吕马允诺将会被应用程序制止。

除了

Access-Control-Allow-Origin字段,CORS机制还能透过其它一些HTTP头部同时实现更复杂的布吕马允诺。例如,

Access-Control-Allow-Methods字段选定了服务器支持的HTTP方法,

Access-Control-Allow-Headers选定了服务器接受的允诺头,

Access-Control-Allow-Credentials选定了允诺是否需要采用凭证等等。

下面是两个简单的CORS实例标识符,在服务器端须要添加

Access-Control-Allow-Origin头部。 // 表述CORS允许出访的搜索引擎 const ALLOW_ORIGIN = https://example.com const http = require(http); http.createServer(function(req, res) { console.log(request method:, req.method); console.log(request url:, req.url); console.log(request headers:, req.headers);if (req.method === OPTIONS) { // 处理预检允诺 res.writeHead(200, { Access-Control-Allow-Origin: ALLOW_ORIGIN,//此处选定了允许出访的搜索引擎 Access-Control-Allow-Methods: POST,GET,OPTIONS, Access-Control-Allow-Headers: X-Requested-With,Content-Type, Access-Control-Allow-Credentials: true, Content-Length: 0}); res.end(); }else { // 处理CORS允诺 res.writeHead(200, { Access-Control-Allow-Origin: ALLOW_ORIGIN,//此处选定了允许出访的搜索引擎 Access-Control-Allow-Credentials: true, Content-Type: application/json }); res.write(JSON.stringify({msg: Hello CORS!})); res.end(); } }).listen(3000, function() { console.log(Listening on port 3000); });

这段标识符建立了两个HTTP服务器,当应用程序向该服务器发送CORS允诺时,服务器会在响应头中添加

Access-Control-Allow-Origin和

Access-Control-Allow-Credentials字段,从而允许布吕马出访。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务