跨域
举个例子:一个域名为 a.com 的网站,它发起一个资源路径为 a.com/test 的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为 http,端口号默认为 80)。但是,如果发起一个资源路径为 b.com/test 的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制。
同源策略(Same-origin Policy)
- 同源策略是 Netscape 提出的一个著名的安全策略
- 同源策略是浏览器最核心最基础的安全策略
- 现在所有的可支持 Javascript 的浏览器都会使用这个策略
- web 构建在同源策略基础之上,浏览器对非同源脚本的限制措施是对同源策略的具体实现
同源策略的含义 DOM 层面的同源策略:限制了来自不同源的”Document”对象或 JS 脚本,对当前“document”对象的读取或设置某些属性 Cookie 和 XMLHttpRequest 层面的同源策略:禁止 Ajax 直接发起跨域 HTTP 请求(其实可以发送请求,结果被浏览器拦截,不展示),同时 Ajax 请求不能携带与本网站不同源的 Cookie。
同源策略的非绝对性:<script>
<img>
<iframe>
<link>
<video>
<audio>
等带有 src 属性的标签可以从不同的域加载和执行资源。
其他插件的同源策略:flash、java applet、silverlight、googlegears 等浏览器加载的第三方插件也有各自的同源策略。
域名、协议、端口三者均相同就是同源。
跨域的几种方法
-
JSONP
JSONP 本质上是利用
<script>
<img>
<iframe>
等标签不受同源策略限制,可以从不同域加载并执行资源的特性,来实现数据跨域传输。JSONP 的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段 Javascript,在这段 Javascript 代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了。
-
CORS
跨源资源共享 Cross-Origin Resource Sharing(CORS) 是一个新的 W3C 标准,它新增的一组 HTTP 首部字段,允许服务端其声明哪些源站有权限访问哪些资源。换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制。另外,规范也要求对于非简单请求,浏览器必须首先使用 OPTION 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求,在服务器确定允许后,才发起实际的 HTTP 请求。
其中包括:Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Max-Age、Access-Control-Allow-Credentials (如果需要在 Ajax 中设置和获取 Cookie,那么 Access-Control-Allow-Origin 首部字段不能设置为* ,必须设置为具体的 origin 源站)
-
浏览器插件 & 设置
- Allow-Control-Allow-Origin
- 关闭 Chrome 浏览器安全策略:open -n /Applications/Google\ Chrome.app/ –args –disable-web-security –user-data-dir=/Users/xxx/Documents/MyChromeDev