对跨域的理解

码界逐浪人
• 阅读 901

1.什么是跨域

跨域指的的浏览器不能执行其它网站的脚本。它是由浏览器的同源策略导致的,是浏览器对js实施的安全措施。

2.什么是同源策略

同源指的是:url的协议、域名、端口均为相同
如果没有同源策略限制,浏览器很容易受到XSS、CSFR等攻击。
同源策略限制以下几种行为:
1.Cookie、LocalStorage 和 IndexDB 无法读取
2.DOM和JS对象无法获得
3.AJAX 请求不能发送

3.常见的跨域场景

以url:http://www.domain.com为对比:

url说明是否允许
http://www.domain.com/a.js协议域名都相同,不同文件允许
http://www.domain.com/b.js协议域名都相同,不同文件允许
https://www.domain.com/a.js协议不相同不允许
http://www.domain1.com/a.js主域名不相同不允许
http://xxx.domain.com/a.js子域名不相同不允许
http://www.domain.com:9000/a.js端口不相同不允许

4.跨域解决方案

4.1 JSONP

实现原理:利用script标签src属性中的链接却可以访问跨域的js脚本,服务端不再返回JSON格式的数据,而是返回一段调用一个函数的js代码,然后将数据作为参数传递了过来,在src中进行了调用,这样实现了跨域。由于这种方式传参,jsonp只能发送get请求。
示例代码:

 <script>
    let script = document.createElement('script');
    script.type = 'text/javascript';

    // 传参一个回调函数callback给后端,后端返回时执行这个在前端定义的回调函数并把数据传递过来
    script.src = 'http://localhost:9500/login?callback=handleCallback';
    document.head.appendChild(script);

    // 回调执行函数(接收数据)
    function handleCallback(res) {
      alert(JSON.stringify(res));
    }
  </script>

4.2 跨域资源共享(CORS)

CORS 全称 Cross-origin Resource Sharing 中文名称 “跨域资源共享” 它突破了浏览器只能发送同源请求向服务器获取数据的限制。

它允许浏览器向跨域服务器跨域,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

需要在服务端设置:
Access-Control-Allow-Origin 表示允许跨域的来源
Access-Control-Allow-Methods 表示允许跨域方法
Access-Control-Allow-Headers 表示允许接受的自定义header字段名
Access-Control-Max-Age 表示预检请求的结果能够被缓存多久,即在多久内可以省略 预检请求

4.3 nginx代理跨域

nginx代理跨域,实质和CORS跨域原理一样,通过配置文件请求响应头实现
静态文件设置跨域:

location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
        # 使得html、js、css等文件可以跨域访问
        add_header Access-Control-Allow-Origin *;
    }

接口反向代理跨域

location ~* ^/(auth|function|admin){
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' 'http://127.0.0.1:9500';
      add_header 'Access-Control-Allow-Methods' 'PUT,DELETE';
      add_header 'Access-Control-Allow-Headers' 'Test-CORS, Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Content-Length' 0;
      return 204;
    }

    add_header 'Access-Control-Allow-Origin' 'http://127.0.0.1:9500';
    add_header 'Access-Control-Allow-Credentials' 'true';

    proxy_pass http://127.0.0.1:7000;
    proxy_set_header Host $host;
  }

4.4 document.domain + iframe跨域

此方案仅限主域相同,子域不同的跨域应用场景。
实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。
示例代码:

// 父子页面都设置document.domain为相同的域
<script>
    document.domain = 'domain.com';
</script>

4.5 location.hash + iframe跨域

实现原理: a域与b域跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

4.6 postMessage跨域

postMessage是HTML5中为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:
1、页面和其打开的新窗口的数据传递
2、多窗口之间消息传递
3、页面与嵌套的iframe消息传递
4、上面三个场景的跨域数据传递

4.7 WebSocket协议跨域

WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯。

点赞
收藏
评论区
推荐文章
室与 室与
4年前
Cors跨域解决
一、浏览器跨域问题产生1、跨源资源共享(CORS)中文文档:https://developer.mozilla.org/zhCN/docs/Web/HTTP/Access_control_CORS2、什么是浏览器跨域问题指的是浏览器不能执行其他网站的脚本。JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象,即同源策略。就好比我
芝士年糕 芝士年糕
2年前
什么是跨域
域: 是指浏览器不能执行其他网站的脚本跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 
kenx kenx
3年前
SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑
前言最近在做项目的时候,基于前后端分离的权限管理系统,后台使用SpringSecurity作为权限控制管理,然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用SpringSecurity时候单独配置,SpringBoot跨越还不行,还需要配置Security跨域才行。什么是跨域跨域是一种浏览器同源安全策略,即浏
专注IP定位 专注IP定位
3年前
浅析九种跨域方式实现原理
我们在解决一个问题的时候应该先去了解这个问题是如何产生的,为什么会有跨域的存在呢?其实,最终的罪魁祸首都是浏览器的同源策略,浏览器的同源策略限制我们只能在相同的协议、IP地址、端口号相同,如果有任何一个不通,都不能相互的获取数据。并且,http和https之间也存在跨域,因为https一般采用的是443端口,http采用的是80端口或者其他。同源策略是一种约
Stella981 Stella981
3年前
Https请求的页面中无法使用http访问
今天遇到一个问题,使用https访问的页面,其间发起http的ajax的请求都被浏览器拒绝,必须为https,否则无法请求,导致页面局部未初始化。浏览器报错Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS.百度了下,了解到同源策略。所谓“同源”指的是:协议相同、域名相
Wesley13 Wesley13
3年前
JavaEE从服务器端解决Ajax跨域问题
1、Ajax跨域简介  1、指的是浏览器不能执行其他网站的脚本。是浏览器施加的安全限制。js本身不跨域,使用form表单和iframe直接请求,是不会跨域的;  2、只要两个url的协议、域名、端口其中有一个不同,从其中一个url中使用ajax请求另一个url,则属于Ajax跨域;  3、ajax请求接口,只是不能进入回调函数,接口还是可以正常请
Stella981 Stella981
3年前
SpringBoot实现jsonp跨域通信
实现jsonp跨域通信实现基于jsonp的跨域通信方案原理浏览器对非同源ajax请求有限制,不允许发送跨域请求目前跨域解决方案有两种cros配置jsonp请求cros为新规范,通过一个head请求询问服务器是否允许跨域,若不允许则被拦截jso
Stella981 Stella981
3年前
Js中的跨域问题
一、什么是跨域?1.定义:跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com页面去请求www.google.com的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。跨域的严格一点的定义是:只要协议,域名,端口有任何一
Stella981 Stella981
3年前
35道面向初中级前端的基础面试题
如需获取完整版229页PDF面试题,请直接滑到文末。1\.什么是同源策略?同源策略可防止JavaScript发起跨域请求。源被定义为协议、主机名和端口号的组合。此策略可防止页面上的恶意脚本通过该页面的文档对象模型,访问另一个网页上的敏感数据。参考资料:浏览器的同源策略(https://www.oschina.
liam liam
1年前
解决 Axios 跨域阻碍,提高前端接口访问效率
跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用XMLHttpRequest和Fetch请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对施加的安全限制。Axios跨域常见报错跨域请求被阻止(CrossOriginRe
ZOS对象存储跨域资源访问的实现和使用
跨域指的是从一个域名去请求另外一个域名的资源,即跨域名请求。跨域时,浏览器不能执行其他域名网站的脚本,这是由浏览器的同源策略造成的,是浏览器施加的安全限制。同源策略是一种约定,是浏览器最核心也最基本的安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这是一个用于隔离潜在恶意文件的重要安全机制。