什么是同源:
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。
同源策略是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。 非同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
非同源受到的限制:
- cookie不能读取
- dom无法获得
- ajax请求不能发送
什么是跨域
跨域是指跨域名的访问,以下情况都属于跨域:
跨域原因说明 示例
- 域名不同 www.jd.com 与 www.taobao.com
- 域名相同,端口不同 www.jd.com:8080 与 www.jd.com:8081
- 二级域名不同 item.jd.com 与 miaosha.jd.com
- 如果域名和端口都相同,但是请求路径不同,不属于跨域,如: www.jd.com/item 与 www.jd.com/goods
跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。
因此:跨域问题 是针对ajax的一种限制。
JSONP跨域
JSONP即JSON with Padding
为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSONP数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。而动态添加一个script标签,script标签的src属性是没有跨域的限制的。这样一来,这种跨域方式就与ajax XmlHttpRequest协议无关了。 我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象,这种跨域的通讯方式称为JSONP。
JSONP的优点是:它不像XmlHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行(IE跨域要用JSONP来解决),不需要XmlHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。
限制:
- 需要服务的支持
- 只能发起GET请求
CORS跨域
CORS:全称"跨域资源共享"(Cross-origin resource sharing)。
CORS需要浏览器和服务器同时支持,才可以实现跨域请求,目前几乎所有浏览器都支持CORS,IE则不能低于IE10。CORS的整个过程都由浏览器自动完成,前端无需做任何设置,跟平时发送ajax请求并无差异。所以,实现CORS的关键在于服务器,只要服务器实现CORS接口,就可以实现跨域通信。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
对于简单请求,浏览器会直接发送CORS请求,具体说来就是在header中加入origin请求头字段。同样,在响应头中,返回服务器设置的相关CORS头部字段,Access-Control-Allow-Origin字段为允许跨域请求的源。请求时浏览器在请求头的Origin中说明请求的源,服务器收到后发现允许该源跨域请求,则会成功返回。
简单请求
(1) 请求方法是以下三种方法之一:
- HEAD
- GET
- POST
(2)HTTP的头信息不超出以下几种字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
当浏览器发现发现的ajax请求是简单请求时,会在请求头中携带一个字段:Origin.
Origin中会指出当前请求属于哪个域(协议+域名+端口)。服务器会根据这个值决定是否允许其跨域。
如果服务器允许跨域,需要在返回的响应头中携带下面信息: Access-Control-Allow-Origin:可接受的域,是一个具体域名或者*,代表任意。