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 相关文章推荐
在JavaScript中实现命名空间
Nov 23 Javascript
jquery判断单个复选框是否被选中的代码
Sep 03 Javascript
javascript的console.log()用法小结
May 31 Javascript
简单实用jquery版三级联动select示例
Jul 04 Javascript
JavaScript生成图形验证码
Aug 24 Javascript
谈谈JS中的!!
Dec 07 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
Apr 18 Javascript
浅析node.js的模块加载机制
May 25 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
vue:el-input输入时限制输入的类型操作
Aug 05 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 Javascript
openlayers4.6.5实现距离量测和面积量测
Sep 25 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购物车实现代码
2011/10/10 PHP
优化PHP程序的方法小结
2012/02/23 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
简单理解Python中基于生成器的状态机
2015/04/13 Python
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python中setuptools的作用是什么
2020/06/19 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
保荐人的岗位职责
2013/11/19 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
解除同居协议书
2015/01/29 职场文书
圆明园观后感
2015/06/03 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python