热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于跨域以及跨域的完成体式格局

关于跨域why?为何会有跨域?我们得先了解下同源战略(SOP,SameOriginPolicy)。浏览器出于平安方面的斟酌,只能接见与包括它的页面位于统一个域中的资本,该战略为通讯

关于跨域

why?

为何会有跨域?

我们得先了解下 ==同源战略(SOP, Same Origin Policy)==。

浏览器出于平安方面的斟酌,只能接见与包括它的页面位于统一个域中的资本,该战略为通讯设置了“雷同的协定、雷同的域、雷同的端口”这一限定。试图接见上述限定以外的资本,都邑激发平安毛病。这类平安战略能够防备某些歹意行动。

简而言之,

  1. 同协定 Same Protocol
  2. 同域名 Same Hostname
  3. 同端口号 Same Port

Same Protocol && Same Hostname && Same Port

What?

什么是跨域?

==跨域就是采纳手艺计划打破同源战略的限定,完成差别域之间交互(请求相应)。==

How?

那末怎样完成跨域呢?
有以下几种要领。

==要领一==

CORS (Cross-Origin Resource Sharing,跨域源资本共享),是一种ajax跨域请求资本的体式格局,支撑当代浏览器,IE支撑10以上,经由历程XMLHttpRequest完成Ajax通讯的一个重要限定就是同源战略。
CORS是W3C的一个事情草案,定义了在必需接见跨境资本时,浏览器和服务器该怎样沟通。CORS的基础思想,就时运用自定义的HTTP头部让浏览器和服务器举行沟通,从而决议请求或许相应应当胜利照样失利。
完成思绪:运用XMLHttpRequest发送请求时,浏览器会给该请求自动增加一个请求头:Origin。服务器经由一系列处置惩罚,假如肯定请求泉源页面属于白名单,则在相应头部到场首部字段:Access-Control-Allow-Origin。浏览器比较请求头部的Origin 和相应头部的 Access-Control-Allow-Origin是不是一致,一致的话,浏览器获得相应数据。假如服务器没有设置Access-Control-Allow-Origin 或许这个头部源信息不婚配,浏览器就会驳回请求。

模仿CORS的完成

步骤1.

怎样假装一个网站(在当地)?

1.编辑hosts文件

苹果mac: 直接在git bash上输入命令行操纵即可 “sudo vi /etc.hosts” ,或许下载一些图形界面运用软件直接修正。

Windows操纵体系:

  1. win键(四个方块的键)+ R = 弹开运转窗口
  2. 复制该文件途径 c:windowssystem32driversetc
  3. 选中hosts文件,右键-属性-平安-挑选组或用户名(增加修正保留的权限的对象)- 编辑 – 再次挑选组或用户名(增加修正保留的权限的对象 – 勾选权限(选项在此不表)
  4. 翻开hosts文件,写入 127.0.0.1 localhost;127.0.0.1 bai.com;127.0.0.1 google.com;能够写入你任何你想模仿的网站,根据这类对应关联花样即可, ip地点+域名。

步骤2.
所需东西
node.js && git bash(模仿服务器),一个简朴的html页面内里有个跨域请求的Ajax通讯。










hello world





//nodeJS模仿后端相应CORS的完成
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
http.createServer(function(req, res){
var urlObj = url.parse(req.url, true)
switch (urlObj.pathname){
case '/getNews':
var news = ['NBA Break News','CBA Break News']
//CORS的完成
res.setHeader('Access-Control-Allow-Origin','http://google.com:8080')
/*res.setHeader('Access-Control-Allow-Origin','*')
服务器设置公用接口
*/
res.end(JSON.stringify(news));
break;
case '/' :
if(urlObj.pathname == '/') {
urlObj.pathname += 'index.html'
}
default:
var filePath = path.join(__dirname, urlObj.pathname);
fs.readFile(filePath,'binary', function(error, fileContent){
if(error){
console.log('404')
res.writeHeader(404, 'not found')
res.end('

404,not found

')
}else {
res.write(fileContent, 'binary')
}
})
}
}).listen(8080);

上面代码就是CORS完成的历程。

  1. 在当地修正hosts文件,127.0.0.1 google.com, 页面的url为 http://google.com:8080。
  2. 在title为google的页面上增加一个ajax请求,该请求以get要领会向baiduServer的端口(’http://baidu.com:8080/getNews’)发送一个请求。
  3. 浏览器会给请求头加上Origin: http://google.com:8080, Request URL: http://baidu.com:8080/getNews。
  4. baiduServer后端,相应头增加首部字段。Access-Control-Allow-Origin: http://google.com:8080。 表明该服务器(baiduServer)接收请求并赋予相应。
  5. 浏览器比较请求头部的Origin 和相应头部的 Access-Control-Allow-Origin是不是一致,一致的话,浏览器获得相应数据。假如服务器没有设置Access-Control-Allow-Origin: http://google.com:8080 或许这个头部源信息不婚配,浏览器就会驳回请求。

固然服务器也能够设置公用接口, res.setHeader(‘Access-Control-Allow-Origin’,’*’)

服务器设置公用接口, 任何人都能够运用该服务器这个端口的数据。

==要领二==

JSONP,是JSON with padding的简写(添补式JSON或参数式JSON)。

JSONP的道理,经由历程动态

如许在两个页面中同时增加document.domain, 就能够完成父页面操控子页面(框架)。

控制台
window.frames[0].document.body
//console输出


this is http://b.shawroc.com:8080/b.html




代码



















this is http://b.shawroc.com:8080/b.html





==要领四==

html5的postMessage API

html5引入的postMessage()要领,许可来自差别源的剧本采纳异步体式格局举行有限的通讯,能够完成跨文本档、多窗口、跨域音讯通报。

postMessage(data, origin) 要领,接收两个参数。

1.data:要通报的数据,html5范例中提到该参数能够是Javascript的恣意基础范例或可复制的对象,但是并非一切浏览器都做到了这点儿,部份浏览器只能处置惩罚字符串参数,所以我们在通报参数的时刻须要运用JSON.stringify()要领对对象参数序列化,在低版本IE中援用json2.js能够完成相似结果。

2.origin:字符串参数,指明目的窗口的源,协定+主机+端口号[+URL],URL会被疏忽,所以能够不写,这个参数是为了平安斟酌,postMessage()要领只会将message通报给指定窗口,固然假如情愿也能够建参数设置为”*”,如许能够通报给恣意窗口,假如要指定和当前窗口同源的话设置为”/”。

范例

模仿postMessage的事情机制

改写hosts文件

127.0.0.1 a.com

127.0.0.1 b.com























this is http://b.com:8080/b.html




//nodeJS 模仿后端
var http = require('http');
var fs = require('fs');
var path = require('path');
var url = require('url');
http.createServer(function(req,res){
var urlObj = url.parse(req.url, true);
switch(urlObj.pathname) {
case '/getNews' :
var news = ['NBA Break News','CBA Break News'];
res.setHeader('Content-Type','text/Javascript; charset=utf-8');
if(urlObj.query.newsData){
var data = urlObj.query.newsData + '(' + JSON.stringify(news) + ')' ;
res.end(data);
} else {
res.end(JSON.stringify(news))
}
break;
case '/' :
if(urlObj.pathname == '/') {
urlObj.pathname += 'index.html'
}
default:
var filePath = path.join(__dirname, 'postMessage' ,urlObj.pathname);
fs.readFile(filePath, function(error, data) {
if(error) {
res.writeHeader(404, 'not found');
res.end('

404, Not Found

');
} else {
res.end(data)
}
});
};
}).listen(8080);

剖析代码
步骤1, a.com:8080/a.html页面下的input发作输入事宜时, 向目的窗口发一个MessageEvent事宜, MessageEvent.data能够获得this.value的值。接下来切换到b.html页面。

步骤2, 在b.com:8080/b.html监听message事宜,在这,就能够完成 a.com:8080/a. html的input标签输入什么,嵌入在 a.com:8080/a. html的iframe框架(b.com:8080/b.html)同步父页面(a.com:8080/a. html)的输入内容了。

步骤3,b.com:8080/b.html的input发作输入事宜时,向嵌套页面的父页面window.parent(a.com:8080 )postMessage,然后切回到a.html。

步骤4, 监听嵌套页面b.com:8080/b.html的messageEvent事宜,把b.com:8080/b.html的input.value(message.data)赋值给a.com:8080的input.value, 完成输入内容的双向同步。


推荐阅读
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这篇“Webpack是怎么工作的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大 ... [详细]
  • 前端监控数据网络(要求阻拦)
    所谓web,纵然你我素未谋面,便知志趣相投;深居简出,亦知天下之大。01—为何阻拦要求如今的web运用,大都是经由过程要求(http)去猎取资本,拿到资本后再显现给用户,一个页面中 ... [详细]
  • 新版本在线体验地点已上线,迎接体验?—2017-01-14喜好就Star,不只是Fork;想要分享的结果才是驱动力,而手艺仅仅是一种要领。TP-adminTP-admin即基于Th ... [详细]
  • Iamtryingtoachievethearrowpointingupwards..iamtryingtoachieveitinmycssiamnotabl ... [详细]
  • js中运行机制的详细分析(示例解析)
    web前端|js教程node.js,html5,html,css,javascriptweb前端-js教程本篇文章给大家带来的内容是关于js中运行机制的详细分析(示例解析),有一定 ... [详细]
  • 示例代码托管在:http:www.github.comdashnowordsblogs博客园地点:《大史住在大前端》原创博文目次华为云社区地点:【你要的前端打怪晋级指南】[TOC] ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 前言:原本纠结于Web 模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中eval函数。虽然eval函 ... [详细]
  • 前端简史之纵横:Node东出
    引💡Ajax的出现,带来了jQuery时代,而jQuery时代也伴随着Node风暴淡淡退出了历史舞台。如果说Ajax给前端带来了从网页静 ... [详细]
author-avatar
大大文人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有