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和jquery判断浏览器版本等信息
Jul 04 Javascript
JS中操作JSON总结
Dec 06 Javascript
window.onload绑定多个事件的两种解决方案
May 15 Javascript
js css+html实现简单的日历
Jul 14 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
javascript实现Emrips反质数枚举的示例代码
Dec 06 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
基于jquery实现左右上下移动效果
May 02 jQuery
Koa 中的错误处理解析
Apr 09 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
Nov 13 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
实现树状结构的两种方法
2006/10/09 PHP
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
商务主管岗位职责
2013/12/08 职场文书
企业内控岗位的职责
2014/02/07 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
英语专业求职信
2014/07/08 职场文书
新闻学专业求职信
2014/07/28 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
租赁协议书
2015/01/27 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python