跨域是什么?如何实现?

㈠定义

⑴跨域,是指浏览器不能执行其他网站的脚本。

⑵它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

 

㈡造成跨域的场景

协议不同   域名不同    端口不同

②什么是协议,域名,端口?

解释:假如一个网址是  http://baidu.com:8080?user=name&pwd=password

http://   是协议   

baidu.com  是域名(注意:前面加上“wwww”即www.baidu.com不是域名)

8080  是端口    

user=name&pwd=password   是地址带的参数

 

⑴域名不同(域名访问和IP访问也造成跨域)

http://www.baidu.com

http://14.215.177.38

http://www.case.com

 

⑵子域名不同

http://www.example.com

http://a.example.com

 

⑶端口不同

http://www.example.com(:80)

http://www.example.com(:8080)

 

⑷协议不同

http://www.example.com

https://www.example.com

 

㈢实现跨域访问的方式

JSONP跨域

iFrame跨域

协议跨域 (跨域资源访问CORS)

 

㈣JSONP跨域

⑴原理: 利用script标签src可以用外链的功能。

即:<script src="http://www.external.com/link/action.js"></script>

 

⑵必要条件:

1、 externalLink返回的内容必须为一段可执行脚本

2、 当前域同外域约定好脚本执行的函数名(jsonpCallback)

3、 传入函数的实参data


⑶格式如下

action.js  content:

jsonpCallback(data);

data type:  number| string | boolean | object

当前域声明函数:
jsonpCallback(result) {
     /* code statement */
 }

 

㈤iFrame跨域

iframe存在页面嵌套关系,即会有父页面(outer.html)和子页面(inner.html)。

这样就存在父页面使用子页面的数据,子页面使用父页面数据的情况。

1. 非一个根域:

需要一个中间页面做代理,通过window.name获取不同域页面下的数据.

原理: iframe加载不同的src,window.name是可以被传递的。

父页面: lichenfan.com

子页面: innomachine.com.cn

父页面--->子页面数据

1) load 子页面,子页面设置window.name. 

2) load 代理页面,代理页面和父页面同域。

子页面--->父页面数据

load 子页面,给子页面的页面路径修改不同的hash

子页面定义window.onhashchange的事件,触发获取数据。

2. 同一个根域: 

www.lichenfan.com 和 sen.lichenfan.com

在当前的文档下设置 document.domain = "lichenfan.com" 即可。

父页面--->子页面数据

window.iframe.contentWindow.xx;

子页面--->父页面数据

window.parent.xxx;

㈥协议跨域

被访问域名在webservice配置跨域访问的header即可,会用到两个header。

Access-Control-Allow-Origin: * | 访问域名;

Access-Control-Allow-Methods: GET | POST | PUT | DELETE;

参考:https://zhuanlan.zhihu.com/p/24632196

 

原文地址:https://www.cnblogs.com/shihaiying/p/12153201.html