什么是同源
同domain(或ip),同端口,同协议视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源。这种安全限制称为同源策略。
为什么要有同源限制
同源策略的目的主要是为了防止恶意获取/修改网站数据。而这些数据主要包括cookie,LocalStorage,DOM,以及发送的AJAX请求。
假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一 个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问 这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发生。
所以,我们可以知道,同源策略是必须的,但是,有的时候我们还是要规避同源策略的限制,比如说从A网站跳到B网站时,我们要读到A网站的cookie。
document.domain
document.domain属性用来得到当前网页的域名。
我们也可以给document.domain属性赋值,不过是有限制的,你只能赋成当前的域名或者基础域名。
比如:你当前域名是qa-my.test.segmentgault.com
那么你就可以设置
document.domain = ".test.segmentgault.com"
或者
document.domain = "qa-my.test.segmentgault.com"
上面的赋值都是成功的,因为qa-my.test.segmentgault.com是当前的域名,而.test.segmentgault.com是基础域名。
但是下面的赋值就会出来"参数无效"的错误:
document.domain = "google.com"
因为google.com即不是当前的域名也不是当前域名的基础域名,所以会有错误出现。
这是为了防止有人恶意修改document.domain来实现跨域偷取数据。
利用document.domain 实现共享cookie
Cookie 是服务器写入浏览器的一小段信息,只有同源的网页才能共享。浏览器允许基础域名相同的网站间通过设置document.domain共享 Cookie。
举例来说,A网页是
http://my.segmentfault.com/a.html
B网页是
http://he.segmentfault.com/b.html
那么只要设置相同的document.domain,两个网页就可以共享Cookie。
document.domain = 'segmentfault.com'
现在,A网页通过脚本设置一个 Cookie
document.cookie = "domainTest=hello world"
B网页就可以读到这个Cookie
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。