Vue axios与Go Frame后端框架的Options请求跨域问题详解


Posted in Javascript onMarch 03, 2020

跨域问题可从前后两端分开排查:

前端:Vue + axios

axios 请求头使用 'Content-Type': 'application/json',

并且在Header中设置了 Authorization 字段用于传递 Token,

参数未经 Qs 转码,

使用以下代码测试登录接口:

// 为方便操作,已将 axios 实例挂载到 this.$axios 上
this.$axios.post('/signin', {account: '', password: ''})
 .then(res => {
  console.log('成功:', res)
 })
 .catch(err => {
  console.log('失败: ', err)
 })

出现如下错误:

Access to XMLHttpRequest at 'http://127.0.0.1:8080/api/v1/signin' from origin 'http://localhost:8081' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

同时 POST 请求变成了 OPTIONS 请求,并且返回404,如下图:

Vue axios与Go Frame后端框架的Options请求跨域问题详解

这里有两个问题,一个是为什么 POST 变成了 OPTIONS?URL 路径没错,为什么又会返回 404?

POST 变 OPTIONS 问题涉及复杂跨域请求,符合以下任意一个条件的请求就算复杂请求:

  1. 使用了除 HEAD、GET、POST之外的请求方法;
  2. 头部字段不超出 Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type,并且 Content-Type 的值只限于 application/x-www-form-urlencoded、multipart/form-data、text/plain;

由于设置的 Authorization 字段,Content-Type 也设置为了 application/json,因此这个请求算复杂跨域请求,会在正式通信前增加一次 OPTIONS 查询请求,称为"预检"请求(preflight request),用于向服务器请求权限等信息,预检请求被成功响应后,才会发出真实的 POST 请求。

可为什么 OPTIONS 请求返回 404 呢?
通过上面的错误说明及分析,答案应该很清晰了,就是服务端路由未对 OPTIONS 类型请求做出响应,导致 404 的情况。

后端:GoFrame

GoFrame 的路由代码如下:

func init() {
 s := g.Server()
 // 绑定 CORS 中间件
 s.BindMiddleware("/api/*", middleware.CORS)
 s.Group("/api", func(group *ghttp.RouterGroup) {
  ...
  // 重点:此路由仅支持 POST
  group.POST("/signin", userController, "SignIn")
 }
}

/signin 的路由指定了请求方式为 POST,自然无法响应其他类型的请求,使用如下方式定义倒是可响应所有类型的请求:

group.ALL("/signin", userController, "SignIn")

这样就使该路由支持所有的请求方法,但需要在控制器的 SignIn 方法中做判断需要响应哪些类型的请求,很繁琐,不推荐此方式。

其实只要在 CORS 中间件中对 OPTIONS 请求做统一响应即可,上代码:

// CORS 允许接口跨域请求
func CORS(r *ghttp.Request) {
 // 使用框架默认的 CORS 设置
 r.Response.CORSDefault()
 if r.Method == "OPTIONS" {
  r.Response.WriteStatusExit(http.StatusOK)
 } else {
  r.Middleware.Next()
 }
}

另外需要注意的是,使用 GoFrame 框架,CORS 中间件要在全局添加,如果在路由组中添加,同样会出现 OPTIONS 请求 404 的情况,而且中间件的代码在请求过程中未执行,原因暂不清楚,还需要多了解下框架。

本文描述的跨域问题是在网页上使用 Vue + axios 时出现的,使用 Postman 工具调试则一切正常,这里记录下排查过程和解决方法,希望能帮到有需要的童鞋,有任何问题可以在评论里一起讨论下。

到此这篇关于Vue axios与Go Frame后端框架的Options请求跨域问题详解的文章就介绍到这了,更多相关Vue axios与Go Frame跨域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
JavaScript转换农历类实现及调用方法
Jan 27 Javascript
jquery判断元素是否隐藏的多种方法
May 06 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
21个JavaScript事件(Events)属性汇总
Dec 02 Javascript
深入浅析JavaScript面向对象和原型函数
Feb 06 Javascript
深入探讨Vue.js组件和组件通信
Sep 12 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
Mar 17 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
Oct 20 Javascript
vue动态路由配置及路由传参的方式
May 23 Javascript
前端axios下载excel文件(二进制)的处理方法
Jul 31 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 #Javascript
vue中改变滚动条样式的方法
Mar 03 #Javascript
vue倒计时刷新页面不会从头开始的解决方法
Mar 03 #Javascript
vuex(vue状态管理)的特殊应用案例分享
Mar 03 #Javascript
使用vue打包进行云服务器上传的问题
Mar 02 #Javascript
微信小程序scroll-view的滚动条设置实现
Mar 02 #Javascript
JS如何生成随机验证码
Mar 02 #Javascript
You might like
PHP原理之异常机制深入分析
2010/08/08 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php绘制圆形的方法
2015/01/24 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
python选择排序算法实例总结
2015/07/01 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
简单了解Django模板的使用
2017/12/20 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
小车司机岗位职责
2013/11/25 职场文书
数控机床专业自荐信
2014/05/19 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
大学生团员个人总结
2015/02/14 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书