这是浏览器的一个基本却又非常重要的安全策略,浏览器会限制对异源(异域)
(我们常称之为别人家的站点)的资源操作。打个比方,你不会让老王来你家,也不允许他在你家墙上打个洞,装个监控啥的。通过这个比喻你就知道同源策略
的重要性了。
同源策略
主要针对脚本(script)
的行为进行限制,而<script>
,<link>
,<img>
,<iframe>
,<object>
等带有src
属性的dom元素
一般不受影响,这也很好理解,你可以禁止老王进你家,但是无法限制他在自己家装个雷达对你家进行监控。因此,在没有得到授权的情况下,用javascript
脚本操作异域
的资源,那是不允许的。科学的说法应该是:浏览器允许发起请求,但如果响应中没有包含对方的许可的话,浏览器就会屏蔽响应结果,不给你用。经常会抛出这样的异常: XMLHttpRequest cannot load http://www.othersite.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.mysite.com' is therefore not allowed access.
唠叨了半天异源(异域)
,科学的解释一下什么是源(Origin)
。
公式:Origin = [protocol]://[domain]:[port]
Origin
是你的页面所在的位置。例如我有个站点www.mysite.com
,那么它的源
就是http://www.mysite.com:80
,其中[protocol]
的缺省值是http
,[port]
的缺省值是80
。
不管我的站点在哪个页面www.mysite.com/p/1.html
,只要[protocol]
,[domain]
,[port]
三者相同则视为同源
,或者叫同域
,通常称之为同域
,因为我们通常都是叫别人的小名二狗子
,而不会称呼其大名犬次郎
。
更多示例:
URL | Origin |
---|---|
http://www.mysite.com/p/1.html |
http://www.mysite.com |
https://wwww.mysite.com/p/1.html |
https://www.mysite.com |
http://app.mysite.com/p/1.thml |
http://app.mysite.com |
http://www.mysite.net/p/1.html |
http://www.mysite.net |
http://www.mysite.com:9000/p/1.html |
http:www.mysite.com:9000 |
http://www.mysite.com/news/fresh.html |
http://www.mysite.com |
虽然是安全了,但是如果想从我的www.mysite.com
去我的分站son.mysite.com
获取点东西也会被同源策略
禁止,这就不是我们想要的了,那怎么办呢?可以利用<script>
等不受同源策略
限制的dom元素
绕过去,这种方式称之为jsonp
,这是很多年前就提出来的方法,很巧妙不过很繁琐,渐渐地不怎么再使用了,有兴趣的自行google
。
还有现代化的解决方案:CORS(Cross-Origin Resource Sharing)
。还记得同源策略
的规定吗?通过的方式保证信息安全,也就是说浏览器并没有阻止发起跨域请求。浏览器如果在跨域请求的响应(Http Response Headers
)中发现了对方的许可就会认为是安全的。这套标准称之为CORS。
这套标准规定一系列的Http Headers
,让服务器申明哪些资源是可以被谁访问,浏览器通过解析响应头部就能知道是否得到了许可。
举两个简单的
来源: http://www.cnblogs.com/kexxxfeng/p/6505380.html