CORS的原理到底是怎样的?
以前我一直以为,CORS的原理是这样的:
理解一:
服务器A(a.com)在响应头中加上Access-Control-Allow-Origin:*,由服务器A所生成的文档A(a.html)就可以向任何其他域的服务器(b.com,c.com····)发送ajax请求而不被浏览器拦截。
然而今天写代码的时候,发生了一个问题。我明明已经在响应头中加上了Access-Control-Allow-Origin:*,如图: 。
在chrome的调试工具里,也能看到这个响应头确实是有的,如图:
然而,当我发送WFS地图服务请求的时候,还是报了跨域问题,如图:
无奈之下上网查了一些资料,发现了大部分博主对CORS的理解都是下面的理解二,和我以前的理解有很大不同:
理解二:
服务器A(a.com)在响应头中加上Access-Control-Allow-Origin:*,其他客户端就能向服务器A发送跨域请求。在这里,加上响应头的是需要被跨域访问的资源本身,而不是发送跨域请求的主体——文档。
按理解二的说法,那么我的错误就可以解释了。
但是,如果理解二才是对的,我又有了一些其他的疑问:
1.都说跨域请求是被浏览器拦截下来的,那么在服务器里加设置有什么用?
2.如果必须控制资源所在的服务器才能进行跨域,那么对于一些服务器不在自己控制下的情况下,又要怎么实现跨域?
3.服务器对于所有请求,难道不是一视同仁的?理论上,所有请求都是跨域请求啊,因为其他普通请求也都是和服务器不同IP的。那么服务器是怎么将一部分js请求区分开来,并进行跨域判定的呢?
Answers
Access-Control-Allow-Origin:*
简单翻译:权限-控制-允许-来源:全部
也就是说,这个Header是用来告诉浏览器,我的这个URL的资源是允许任何来源的请求访问我的(允许跨域访问)。
也就是说,上面的理解二才是正确的。
回答:
1.浏览器的默认安全策略是禁止跨域的,加上这个,浏览器才会不拦截。
2.“服务器不在自己控制下的情况下”,这就是禁止跨域的意义所在啊,别人不想让你在网页上使用它的AJAX地址。
3.服务器自然是一视同仁的,但是浏览器不是啊,浏览器是有安全策略的。
注意:
拦截跨域请求是浏览器在做的,是为了保证网页安全的!
建议百度看看“JavaScript同源策略”。
简单的说,禁止跨域就是为了保证:网页不会被别的网页的JS篡改,或者伪造,网页的AJAX的地址不会被别人滥用等等。