新工作中的第一次前端跨域

425 阅读4分钟

和后端通了一把

环境 : 本地跑的Vue项目 地址:127.0.0.1:8080 路由器配置了端口映射,通过 公网地址:端口号 可以直接访问到我的本机项目。

①第一次和后端配合,我前端向后端发api请求(获取token值),报了经典的跨域问题:

因为后端也是第一次遇到这个问题,该api用postman访问,用浏览器直接打开,都可以,在代码里就是不行,但是在我的代码里换成一个公共的api,也可以得到结果。弄了挺久,不断调试。最后是在根目录的文件中设置了一个Access-Control-Allow-Origin:*, 最后是通了,服务器返回的token我也可以拿到了。 前端是单纯的用get请求,然后url上带上code参数,我的代码是这样写的:

结果如下:

②后来后端要求添加特定的请求头,前端代码如下:

,但是发送请求的时候,打开控制台发现,报错如下: 当时我也挺懵的,明明请求发送了,但是后台说就是收不到消息。然后用postman测试也是可以拿到token的。然后疑惑了挺久的, 控制台打开network一看如下: 好家伙,发送的请求是options,请求头直接消失,然后最后上网搜了才知道 preflight这个行为。 然后我让后端判断一下这个options这个方法,让他给我返回200,然而没有什么卵用。 最后看了阮一峰前辈的博客才解决了问题,他的博客中提到: 博客地址: (www.ruanyifeng.com/blog/2016/0…)

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。    
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。
浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。 因为我的请求头中Content-Type字段的类型是application/json,所以是一次非简单请求.

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。
只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

然后我让后端设置了可以使用的头信息字段,在我第一次preflight的时候,我打开了控制台,如下: 后端给我返回了一堆Access-control-allow, 然后我的浏览器就就会自动发起第二个get类型的请求,最后token值就拿到了。 但是经测试,那些Access-control-allow并不是那么靠谱,就算没有设置允许的方法,还是可以通过get拿到数据,就算是显式设置成post,get也可以。 那个Access-Control-Max-Age 后端设置了也没有用。

总结

两次都是因为跨域问题。 第一次是赤裸裸的跨域,因为后端那时候啥也没设置。 第二次是穿了条没系带子的裤子。那时候是因为触发了浏览器的"跨域资源共享"中非简单请求,所以会发出预检请求。( 注:cors是一直存在的,第一次是触发了简单请求,不需要预检)

后话

在解决完问题的星期五的下午,公司的前端项目给砍掉了。难受,来公司就是为了搞前端来着,现在工作也是如此难找,前端之路还真是坎坷。 最近学习了Mysql数据库,等我更新吧。