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 相关文章推荐
键盘控制事件应用教程大全
Nov 24 Javascript
JavaScript 对Cookie 操作的封装小结
Dec 31 Javascript
基于jquery的图片的切换(以数字的形式)
Feb 14 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
JQuery控制radio选中和不选中方法总结
Apr 15 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
Aug 12 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
基于Vuex无法观察到值变化的解决方法
Mar 01 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
Preload基础使用方法详解
Feb 03 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代码
2010/02/16 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
js利用Array.splice实现Array的insert/remove
2009/01/13 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
python简单线程和协程学习心得(分享)
2017/06/14 Python
利用python开发app实战的方法
2019/07/09 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
介绍一下linux的文件系统
2012/03/20 面试题
宣传部部长竞选演讲稿
2014/04/26 职场文书
服务口号大全
2014/06/11 职场文书
五四演讲稿范文
2014/09/03 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
就业证明函
2015/06/17 职场文书
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript