前端跨域原理


域名1 域名2 说明 是否允许通信
http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许
http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许
http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许
http://www.a.com/a.js http://70.32.92.74/b.js 域名和域名对应ip 不允许
http://www.a.com/a.js http://script.a.com/b.js 主域相同,子域不同 不允许
http://www.a.com/a.js http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允许

特别注意两点:

  1. 如果是协议和端口造成的跨域问题“前台”是无能为力的,
  2. 在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。

“URL的首部” 指window.location.protocol +window.location.host,也可以理解为“Domains, protocols and ports must match”。

要说道同源策略,我们首先看一下 Document这个对象, 它表示的是浏览器中加载的网页, 我们可以在js代码中操作这个对象

1
2
3
<script type="application/javascript">
document.domain = "baidu.com";
</script>

这个document.domain 就是源, 一般是由协议+域名+端口组成的.
在每个网页中都会有一个document对象, 同理,每个网页中也都会一个domain属性.
在根域范围内,允许你把domain属性的值设置为它的上一级域。例如,在 developer.mozilla.org 域内,可以把domain设置为 “mozilla.org” 但不能设置为 “mozilla.com” 或者”org”。
当在当前页面(js也是加载到当前页面进行调用执行的, 这个最后有给)

上面了同源策略的原理, 我们看一下在实际开发过程中,都有哪些行为受到同源策略影响

  • XMLHttpRequest 请求

  • 标签
    当使用XMLHttpRequest 请求时, 发现如果请求的域名和当前域不是同一个,则会阻止请求

  • 前端解决跨域问题的8种方案(最新最全)

  • 浏览器是如何执行javascript的?

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

  • 由同源策略到前端跨域

  • 详解XMLHttpRequest的跨域资源共享