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 相关文章推荐
Jquery作者John Resig自己封装的javascript 常用函数
Nov 09 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
javascript获取元素偏移量的方法有哪些
Jun 24 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
浅谈javascript中的Function和Arguments
Aug 30 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
Mar 03 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
Jul 23 Javascript
JS实现点星星消除小游戏
Mar 24 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
javascript数组详解
2014/10/22 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
python3中int(整型)的使用教程
2017/03/23 Python
pandas值替换方法
2018/07/10 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
办公室主任主任岗位责任制
2014/02/11 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
2014年工程部工作总结
2014/11/25 职场文书
文言文辞职信
2015/02/28 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android