Vue axios与Go Frame后端框架的Options请求跨域问题详解
跨域问题可从前后两端分开排查:
前端: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) })
出现如下错误:
AccesstoXMLHttpRequestat'http://127.0.0.1:8080/api/v1/signin'fromorigin'http://localhost:8081'hasbeenblockedbyCORSpolicy:Responsetopreflightrequestdoesn'tpassaccesscontrolcheck:ItdoesnothaveHTTPokstatus.
同时POST请求变成了OPTIONS请求,并且返回404,如下图:
这里有两个问题,一个是为什么POST变成了OPTIONS?URL路径没错,为什么又会返回404?
POST变OPTIONS问题涉及复杂跨域请求,符合以下任意一个条件的请求就算复杂请求:
- 使用了除HEAD、GET、POST之外的请求方法;
- 头部字段不超出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查询请求,称为"预检"请求(preflightrequest),用于向服务器请求权限等信息,预检请求被成功响应后,才会发出真实的POST请求。
可为什么OPTIONS请求返回404呢?
通过上面的错误说明及分析,答案应该很清晰了,就是服务端路由未对OPTIONS类型请求做出响应,导致404的情况。
后端:GoFrame
GoFrame的路由代码如下:
funcinit(){ 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允许接口跨域请求 funcCORS(r*ghttp.Request){ //使用框架默认的CORS设置 r.Response.CORSDefault() ifr.Method=="OPTIONS"{ r.Response.WriteStatusExit(http.StatusOK) }else{ r.Middleware.Next() } }
另外需要注意的是,使用GoFrame框架,CORS中间件要在全局添加,如果在路由组中添加,同样会出现OPTIONS请求404的情况,而且中间件的代码在请求过程中未执行,原因暂不清楚,还需要多了解下框架。
本文描述的跨域问题是在网页上使用Vue+axios时出现的,使用Postman工具调试则一切正常,这里记录下排查过程和解决方法,希望能帮到有需要的童鞋,有任何问题可以在评论里一起讨论下。
到此这篇关于Vueaxios与GoFrame后端框架的Options请求跨域问题详解的文章就介绍到这了,更多相关Vueaxios与GoFrame跨域内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。