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请求区分开来,并进行跨域判定的呢?

cors 跨域 wfs

Miyoki 9 years, 4 months ago

之前已经有人写了,看看吧,有好处
构建public APIs与CORS

文明观光团 answered 9 years, 4 months ago

Access-Control-Allow-Origin:*
简单翻译:权限-控制-允许-来源:全部

也就是说,这个Header是用来告诉浏览器,我的这个URL的资源是允许任何来源的请求访问我的(允许跨域访问)。
也就是说,上面的理解二才是正确的。

回答:
1.浏览器的默认安全策略是禁止跨域的,加上这个,浏览器才会不拦截。
2.“服务器不在自己控制下的情况下”,这就是禁止跨域的意义所在啊,别人不想让你在网页上使用它的AJAX地址。
3.服务器自然是一视同仁的,但是浏览器不是啊,浏览器是有安全策略的。

注意:
拦截跨域请求是浏览器在做的,是为了保证网页安全的!

建议百度看看“JavaScript同源策略”。
简单的说,禁止跨域就是为了保证:网页不会被别的网页的JS篡改,或者伪造,网页的AJAX的地址不会被别人滥用等等。

无节操的右脚 answered 9 years, 4 months ago

Your Answer