我看了一些关于跨域的文章,文章中有说到"跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。"
"所谓的同源是指,域名、协议、端口均为相同。"
例子:
用户在访问https://www.aaa.com 时执行网站的js文件ajax请求https://www.aaa.com:8080/user/getInfo
根据这些定义,因为端口不同所以这个ajax请求跨域了,会被浏览器的同源策略拦截,这时就需要在前端代码中做处理。
但是服务端是不知道每个来自客户端的请求是否跨域,所以服务端是没有办法处理跨域问题的。
但事实是服务端可以处理跨域问题,Java中的SpringBoot框架就有提供对跨域的配置。
所以想问下各位是我哪一步理解错了,学艺不精还请指教
###服务端是规则的制定者,不需要知道请求是否跨域。
只需要通过Access-Control-Allow-Origin告诉浏览器这个请求在这个域名下能不能被调用。
不能调用的请求浏览器自己会拦截。
但是服务端是不知道每个来自客户端的请求是否跨域,所以服务端是没有办法处理跨域问题的。
上面这句话说的不对。服务端知道是否跨域,跨域条件是什么?你前面说过了
"所谓的同源是指,域名、协议、端口均为相同。"
那么这些信息服务端如何获取?
- 获取请求的url信息,这个直接拿完整的url就可以了
- 获取来源的地址,这个是在 request headers 中 referer
到这里你要提问了,如果获取不到上述信息怎么办?上述信息就是浏览器添加的,你获取不到认为不是浏览器触发的即可。
当然,在跨域的时候,浏览器发送复杂请求时会先触发 options 预检请求
###在CORS跨域解决方案里浏览和服务端充当的角色可以看看这个文章