作者:木良
面试加油站
跨域是面试中经常会出现的一道问题,面试官通常会问跨域产生的原因是什么?怎么解决跨域?于是“通源策略、cors、jsonp、反向代理”巴拉巴拉一顿输出,个别候选人之间甚至能达到回答顺序、内容表达都一摸一样,这种问答显然意义就不大了,所以今天我们换个角度来问:
Q:以普通ajax为例,不做任何配置的情况下跨域失败的时候,服务端接口返回的内容是什么样的?
很多同学被问到的时候,很自然的想法就是拿不到数据,然后就回答“后端没有返回,控制台报错”。然而事实真的是这样子么?
事实第一,我们来做个Demo:
我们搭建了一个页面和一个接口服务,在页面上发送了一个xxx/api/card/home的get跨域请求,接口端没做cors处理,这时我们在浏览器会看到接口的返回预览里面是“Nothing to preview”,如下图
什么返回都没有,response返回体是空的,控制台报错啦,事实上呢?我们用抓包工具来看下实际接口情况,
是不是和想象的有点不一样?接口返回完成是正常的业务逻辑,这个时候你是不是开始仔细回想跨域的概念了 “跨域问题是浏览器基于同源策略,对前端接口调用时,访问不用协议、域名、端口情况下的限制而产生的”,也就是说跨域根本上是浏览器层面的控制,而非服务端。
实际上也是这样,对于简单跨域,跨域失败对于后端基本是没有感知的,都按照正常业务逻辑处理正常返回,只不过这个时候,在浏览器接收到接口返回的时候,会去校验repose header里面有没有跨域相关的设置(CORS方案,其他Jsonp等方案不在这个范围内),如果跨域验证OK,就正常返回,否则返回跨域错误信息。
对于服务端来说,如果事先约定好了CORS方案,那就会在response里面补充header,如果没有那就正常返回。其次对于复杂跨域来说,这个时候服务端需要先处理一个“预检/options”请求的逻辑,通过之后再走正常逻辑,这里不做多说。
到这,我们在看下上面的问题,答案就很明显了:
Q:以普通ajax为例,不做任何配置的情况下跨域失败的时候,服务端接口返回的内容是什么样的?
A:按照正常逻辑返回,同时由于跨域默认不能携带cookie,所以这里准确来说返回的应该“是无cookie状态下的业务逻辑处理结果”
over~每次一个小问题,面试路上不迷路~