解
跨域问题可从前后两端分开排查:前端: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 beenblocked by CORS policy: Response to preflight request doesn't pass access control check: It does not haveHTTP ok status.
同时 POST 请求变成了 OPTIONS 请求,并且返回404,如下图:
这⾥有两个问题,⼀个是为什么 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/*\ s.Group(\"/api\ ...
// 重点:此路由仅⽀持 POST
group.POST(\"/signin\ }}
/signin 的路由指定了请求⽅式为 POST,⾃然⽆法响应其他类型的请求,使⽤如下⽅式定义倒是可响应所有类型的请求:
group.ALL(\"/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与GoFrame跨域内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
因篇幅问题不能全部显示,请点此查看更多更全内容