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 相关文章推荐
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
jquery异步跨域访问代码
Jun 28 Javascript
javascript实现Table排序的方法
May 15 Javascript
JQuery+CSS实现图片上放置按钮的方法
May 29 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
jQuery弹出div层过2秒自动消失
Nov 29 Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
Oct 19 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
React 实现车牌键盘的示例代码
Dec 20 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 self与$this的详解
2013/06/08 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
如何在PHP中生成随机数
2020/06/04 PHP
超级强大的表单验证
2006/06/26 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
Python字符遍历的艺术
2008/09/06 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python数据库小程序源代码
2019/09/15 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
精选奢华:THE LIST
2019/09/05 全球购物
软件设计的目标是什么
2016/12/04 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
大学教师师德师风演讲稿
2014/08/22 职场文书
教师考核评语大全
2014/12/31 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
员工安全责任协议书
2016/03/22 职场文书
2019大学生实习报告
2019/06/21 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python