同源策略(same-origin policy)及三种跨域方法

1.同源策略

含义:

同源是指文档的来源相同,主要包括三个方面

  • 协议
  • 主机
  • 载入文档的URL端口

所以同源策略就是指脚本只能读取和所属文档来源相同的窗口和文档的属性这样一个规定。

同源策略目的

一项政策的颁布肯定事出有因,所以同源策略也不例外,主要是出于安全性考虑,比如可以防止恶意脚本读取内容

注意:

同源策略限制的是脚本嵌入的文本来源,而不是脚本本身,理解这点特别重要。比如B主机可以通过使用(<script>标签的src)属性加载A主机的脚本,但是却不可以载入A主机的文档,这就是同源策略发挥作用了。

限制范围

非同源,共有三种行为受到限制。

(1) Cookie、LocalStorage 和 IndexDB 无法读取。

(2) DOM 无法获得。

(3) AJAX 请求不能发送。

虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。

2.三种跨域方法

(1)设置document.domain

比如home.example.com要读取developer.example.com里面的文档,由于同源策略的限制,就无法读取,我们通过设置document.domain="example.com";这时就不再受同源策略的限制了。

(2)夸资源共享CORS(Cross-origin resource sharing)

CORS采用新的“origin:”请求头和新的Access-Control-Allow-Origin响应头来扩展HTTP。它允许服务器用头信息显示地列出源,或使用通配符来匹配所有的源并允许任何地址请求文件。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

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

(3)跨文档消息(cross-document messaging)

允许来自一个文档的脚本可以传递消息到另一个文档里的脚本,而不管脚本的来源是否不同,通过调用window.postMessage()方法,可以异步传递消息事件(可以使用onmessage事件处理程序函数来处理它)到窗口的文档里。

参考:

1.javascript权威指南

2.浏览器同源政策及其规避方法

3.跨域资源共享 CORS 详解

同源策略(same-origin policy)及三种跨域方法的更多相关文章

  1. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探

    更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...

  2. js处理的8种跨域方法

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  3. 前端开发必须说的那些事之——同源策略(same origin policy)

    同源策略指的是三个相同 协议相同 域名相同 端口相同 如https://www.baidu.com/hahah.html这个网址来说 https是使用的协议,www.baidu.com是域名,端口号默 ...

  4. web三种跨域请求数据方法

    以下测试代码使用php,浏览器测试使用IE9,chrome,firefox,safari <!DOCTYPE HTML> <html> <head>     < ...

  5. jsonp的三种跨域方式

    1.通过jq的$.ajax()完成跨域,这是我比较喜欢的一种方式. 代码如下: $.ajax({ type:'get', async:true, url:'地址', dataType:'jsonp', ...

  6. AJAX四种跨域处理方法

    同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...

  7. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  8. js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  9. [转]js中几种实用的跨域方法原理详解

    转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...

随机推荐

  1. node版本管理nvm使用

    nvm:Node Version Manager,用来管理node版本,可以在一台机器上来回切换node版本,比较方便. win下建议使用 nvm-windows nodist linux下直接使用n ...

  2. linux 安装php扩展swoole redis

    本文讲的是已经有redis.so 和swoole.so文件的情况 我的环境是xampp php的扩展目录为 /opt/lampp/lib/php/extensions/no-debug-non-zts ...

  3. pycharm下 os.system os.popen执行命令返回有中文乱码

    原文 settings:

  4. Java测试工具使用(1)--Junit

    在进行测试之前需要导入junit的两个包,分别是 junit:4.12;hamcrest-core:1.1 1.基本测试标签 @Test.@Before.@After 2.组测试 有时候多个测试文件, ...

  5. div的隐藏占用空间位置关系

    display:none和visibility:hidden都是把网页上某个元素隐藏起来的功能,但两者有所区别,经过亲自实验,我发现使用 visibility:hidden属性会使对象不可见,但该对象 ...

  6. 小白学flask之hello,world

    from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "He ...

  7. 转:hive-列转行和行转列

    1. 假设我们在hive中有两张表,其中一张表是存用户基本信息,另一张表是存用户的地址信息等,表数据假设如下: user_basic_info: id name 1 a 2 b 3 c 4 d use ...

  8. Spring Boot Async异步执行

    异步调用就是不用等待结果的返回就执行后面的逻辑,同步调用则需要等带结果再执行后面的逻辑. 通常我们使用异步操作都会去创建一个线程执行一段逻辑,然后把这个线程丢到线程池中去执行,代码如下: Execut ...

  9. Android sqlite日期存储

    SQLite日期类型是以TEXT.REAL和INTEGER类型分别不同的格式表示的,对应如下:TEXT: "YYYY-MM-DD HH:MM:SS.SSS"REAL: 以Julia ...

  10. mysql游标的用法及作用

    1当前有三张表A.B.C其中A和B是一对多关系,B和C是一对多关系,现在需要将B中A表的主键存到C中:常规思路就是将B中查询出来然后通过一个update语句来更新C表就可以了,但是B表中有2000多条 ...