Vue 中使用Axios跨域请求问题解决记录

                              

       在学习vue的时候,在网上找了一些解决方案,发现很多要不就是启用代理服务器来跨域,要不就是一堆axios的封装函数贴上来,没有从根本上解决问题.最后有幸看到了关于cros的相关文章,找到了解决方法.

       当前端发送请求格式为post方式时,浏览器检测到跨域请求时,会发送一个OPTIONS类型的预检请求,而服务器要设置相应的规范,也就是请求是否被允许访问.如果服务器没有设置,预检失败,我们的请求时调不到后台接口的.所以给服务器端添加拦截器,在里面

配置响应体的header.

       response.setHeader("Access-Control-Allow-Origin", "*");//允许访问的来源地址

       response.setHeader("Access-Control-Allow-Headers","Content-Type,Content-Length, Authorization, Accept,X-Requested-With");//有些会把token放到header里,加在这里

       response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");//这个一看就懂,

需要设置预检时间的请看最下面.

那预检请求完成之后,前端就会拿到这些响应头

Vue 中使用Axios跨域请求问题解决记录

那只要你这次发送的请求,符合这个头规范,那么请求就会成功的.

如果把前端和服务器比作儿子和爸爸……

前端:爸爸,我要钱

服务器:儿子,你只要好好学习就给你,

前端:恩呢,我才把钢铁是怎样练成的看完了,还考了99分.

服务器:儿子,好样的,给你2块!

 

       下面就是在执行跨域请求的实际测试.

        跨域一般请求方式分为get和post,

        1.当请求为get请求,不执行预检

this.$http.get("http://xxxxx:8090/api/getMsg?id=1").then(fun

ction(response){});                         Vue 中使用Axios跨域请求问题解决记录

          2.    当请求为post方式时 ,执行预检

 this.$http

        .post("http://xxx:8090/api/doLogin", {

          userName: "1",

          password: "1"

        })

        .then(function(response) {

          console.log(response);

        })

        .catch(function(error) {

          console.log(error);

        });

 

第一次使用option方法发送预检请求,检测服务器是否接受该请求

Vue 中使用Axios跨域请求问题解决记录

 

该请求只是为了检测咱们的请求是否能通,不会有响应体返回,也就是response是为空的.

当预检请求通过后,执行普通请求,也就是post请求

Vue 中使用Axios跨域请求问题解决记录

Vue 中使用Axios跨域请求问题解决记录

成功返回数据.

    response.setHeader("Access-Control-Max-Age", time);

Access-Control-Max-Age 这个响应首部表示预检请求的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久。单位为秒,而使用chorme浏览器的默认值为5秒,如果你不设置并且手速很快,你会看到

Vue 中使用Axios跨域请求问题解决记录

除了一次预检,其余所有都是普通请求,前提的你是请求的路径一样,假如请求路径改变了,也会进行预检.