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下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
优化javascript的执行效率一些方法总结
Dec 25 Javascript
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
对js关键字命名的疑问介绍
Apr 25 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
Sep 18 Javascript
老生常谈js数据类型
Aug 03 Javascript
点击按钮弹出模态框的一系列操作代码实例
Mar 29 Javascript
js实现简单分页导航栏效果
Jun 28 Javascript
JS原型对象操作实例分析
Jun 06 Javascript
Vue提供的三种调试方式你知道吗
Jan 18 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
php获取某个目录大小的代码
2008/09/10 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
vue中组件的3种使用方式详解
2019/03/23 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Python脚本处理空格的方法
2016/08/08 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
2016/12/18 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
生物化学研究助理员求职信
2013/10/09 职场文书
运动会稿件300字
2014/02/14 职场文书
大学生就业意向书范文
2014/04/01 职场文书
化学教育专业求职信
2014/07/08 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书