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 文章截取部分无损html显示实现代码
May 04 Javascript
js防止表单重复提交实现代码
Sep 05 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
AngularJS中的模块详解
Jan 29 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
May 12 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
angular 服务的单例模式(依赖注入模式下)详解
Oct 22 Javascript
js删除数组中某几项的方法总结
Jan 16 Javascript
使用typescript改造koa开发框架的实现
Feb 04 Javascript
vue.js实现简单购物车功能
May 30 Javascript
design vue 表格开启列排序的操作
Oct 28 Javascript
vue-video-player 断点续播的实现
Feb 01 Vue.js
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面向对象
2012/02/22 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP时间函数使用详解
2019/03/21 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
python实现发送邮件功能代码
2017/12/14 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
对Python3 序列解包详解
2019/02/16 Python
基于python3生成标签云代码解析
2020/02/18 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
校园学雷锋活动月总结
2014/03/09 职场文书
办公设备采购方案
2014/03/16 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
小学语文业务学习材料
2014/06/02 职场文书
大学课外活动总结
2014/07/09 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
美丽的大脚观后感
2015/06/03 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
vue elementUI表格控制对应列
2022/04/13 Vue.js