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 相关文章推荐
页面中js执行顺序
Nov 09 Javascript
js播放wav文件(源码)
Apr 22 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
Aug 22 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
Sep 04 Javascript
fullpage.js全屏滚动插件使用实例
Sep 06 Javascript
js+css3制作时钟特效
Oct 16 Javascript
在html中引入外部js文件,并调用带参函数的方法
Oct 31 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
Jul 17 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
Javascript String.replace的妙用
2009/09/08 Javascript
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python实现的微信好友数据分析功能示例
2018/06/21 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
python字符串反转的四种方法详解
2019/12/02 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
我未来的职业规划范文
2014/01/11 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
详解MySQL中的pid与socket
2021/06/15 MySQL