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的函数
Jan 31 Javascript
Javascript 定时器调用传递参数的方法
Nov 12 Javascript
js截取函数(indexOf,join等)
Sep 01 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
通过onmouseover选项卡实现img图片的变化
Feb 12 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
Aug 24 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
Nov 22 Javascript
JS中常用的消息框总结
Feb 24 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
Jan 15 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
May 21 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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
python文件比较示例分享
2014/01/10 Python
python使用心得之获得github代码库列表
2014/06/25 Python
玩转python爬虫之正则表达式
2016/02/17 Python
python常用函数详解
2016/09/13 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
保洁公司服务承诺书
2014/05/28 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python