vue项目CORS跨域请求500错误,post请求变options请求
温馨提示:
最后更新时间2020-12-02 17:53:54,若内容或图片失效,请留言反馈!
vue项目CORS跨域请求500,post请求变options请求,到底是什么情况。
提示:以下内容是一个非专业开发的我对跨域的理解,并不10分准确。
一、先介绍为什么明明发送的是Post请求,为什么到服务器端就收到了Options请求,到底是谁在中间搞鬼。
要说明这个问题,要先搞明白什么是跨域。
跨域,就是不同源的网站之间想要传输内容,要解决的问题,全称叫”跨域资源共享“,也称CORS,不同源是指:协议(http,https)、端口、主域不同的站。举例说明下:
1、https://www.linyufan.com/html/和https://www.linyufan.com/ex/index/就是同源。
2、http://www.linyufan.com和https://www.linyufan.com不同源,协议不同,端口也不同,http是80,https是443端口。
3、https://www.zacseo.cn和https://www.linyufan.com不同源,主域不一样,即域名不一样。
同源还是不同源,差不多就是这个意思,只要是不同源,就需要解决”跨域“问题。
二、跨域请求
既然是跨域请求了,就分两类:1、简单请求,2、非简单请求,只要满足下面的几类,就是简单请求,否则就不是简单请求了。
(1) 请求方法是以下三种方法之一:HEAD、GET、POST
(2)HTTP的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
三、跨域流程
1、简单请求
浏览器小伙发出跨域请求,方式(Method)可能是Post,也可能是Get,再带上Headers信息,问题服务器想要一个资源,服务器一看,哦?小伙子不错,知道行内规矩。
这么着吧,你等下,给浏览器小伙发一条响应头,包含我服务器可以接受哪些请求,以什么方式等等。
然后告诉浏览器小伙,说我看看你请求的资源(包含不限于图片、css、js等静态资源,动态的另说),服务器开上自己的Apache或者Nginx小跑车,一路小跑,从这个文件夹跑到那个文件夹,收集够了浏览器小伙请求的资源后,挨个将这些资源发给浏览器小伙,浏览器小伙完成前端页面渲染和加载。
当然这个过程是极其快速及复杂的,还有Cookies、Session,Keep-live等,都需要商量,或者设置好。
总结跨域简单请求就是,一切符合服务器请求规范的,都会立马提供服务。
2、非简单请求
除了上面说的简单请求,另一个类型就是非简单请求,只要请求方式不是上面说的几种,Content-Type也不是上面说的几类,比如像自己加了Headers这些,都会触发浏览器进行非简单请求。也就是会出现Options请求。
Options请求,也叫预检请求,下面简单说说流程。
你在浏览器输入了一个网址,浏览器一看,里面有一些非简单请求的信息,于是乎本着谨慎的态度向服务器先发了一条Options的请求,试探性的问问服务器大哥这个请求可行不?
同时携带【'access-control-request-headers',access-control-request-method】等请求信息,告诉服务器想这么来。
服务器老哥一看,哟,小伙子牛啊,自定义了Headers里的信息,牛归牛,还是得按规矩来。检查了一下自己的笔记本,老板(我)允许这么请求,这个时候我们就看到了Options的响应头信息,里面有可以请求的类型,方式以及域等信息。
接下来浏览器小伙一看,知道了,就按你说的来,于是发送第二波请求,这个时候才是我们要想发送的请求,可能是Post或者Get等。
关于跨域的两种请求方式,大概就是这么个意思,具体的理解按这个介绍来:http://www.ruanyifeng.com/blog/2016/04/cors.html,人家写得比较专业。
知道问题出在哪里,就有对应的解决办法了。
四、CORS跨域Post请求变OPTIONS解决办法
1、将非简单请求改为简单请求,但这个办法好像不是太可行,毕竟我们自己加了Headers,就要发挥作用。
2、将后端请求到的OPTIONS忽略,或者做些别的用处。
3、牛B的解决办法(我不是很清楚,肯定有)。
以上是我看一些对于CORS介绍的文档,根据自己的理解写的,年纪大了,也静不下心来研究其所以然了,已经错过了埋头深干的劲了,只想着赶紧解决问题,其实还是有很多问题,不是很明白。
比如,为什么浏览器要先发一次OPTIONS请求?为什么在跨域的情况下,不同的浏览器返回的信息提示不一样?
文章版权声明:除非注明,否则均为林羽凡原创文章,转载或复制请以超链接形式并注明出处。