在飞行前停止从 Firefox 到 Beego 服务器的 CORS 获取

Posted

技术标签:

【中文标题】在飞行前停止从 Firefox 到 Beego 服务器的 CORS 获取【英文标题】:CORS fetch from Firefox to Beego server stops after pre-flight 【发布时间】:2016-06-19 11:30:30 【问题描述】:

我有一个 ecmascript 7 浏览器应用程序在 Firefox 44.0.2 浏览器中的 http://localhost:3000 上运行。它发布到在https://localdev.net:8443 上运行的 Beego 1.6.0 服务器。 'localdev.net' 在同一个盒子上并解析为本地主机地址。浏览器代码是:

var serverURL = 'https://localdev.net:8443/v1/user/login'
fetch(serverURL, 
  method: 'post',
  headers: 
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  ,
  mode: 'cors',
  cache: 'default',
  body: JSON.stringify(username: this.state.username, password: this.state.password)
)
.then(function(response)
  if (response.status >= 200 && response.status < 300) 
    return Promise.resolve(response)
  
  return Promise.reject(new Error(response.statusText))
)
.then(function(data)
  console.log('data: ' + data)
)
.catch((err) => console.error(serverURL, err.toString()))

beego服务器配置如下处理CORS请求:

beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options
  AllowOrigins:     []string"*",
  AllowMethods:     []string"*",
  AllowHeaders:     []string"Origin",
  ExposeHeaders:    []string"Content-Length",
  AllowCredentials: true,
))

Wireshark 看到客户端向服务器发送飞行前 CORS 选项请求:

OPTIONS /v1/user/login HTTP/1.1\r\n
Host: localdev.imaginout.net:8443\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:44.0) Gecko/20100101 Firefox/44.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.5\r\n
Accept-Encoding: gzip, deflate, br\r\n
Access-Control-Request-Method: POST\r\n
Access-Control-Request-Headers: content-type\r\n
Origin: http://localhost:3000\r\n
Connection: keep-alive\r\n

作为响应,beego 服务器输出:

2016/03/05 12:54:29 [router.go:828][D] | OPTIONS    | /v1/user/login                           | 102.08µs         | not match   |

即使服务器说“不匹配”,wireshark 也会记录响应:

HTTP/1.1 200 OK\r\n
Access-Control-Allow-Credentials: true\r\n
Access-Control-Allow-Origin: http://localhost:3000\r\n
Access-Control-Expose-Headers: Content-Length\r\n
Server: beegoServer:1.6.0\r\n
Date: Sat, 05 Mar 2016 17:54:29 GMT\r\n
Content-Length: 0\r\n
Content-Type: text/plain; charset=utf-8\r\n

对我来说,将 Access-Control-Allow-Origin 设置为浏览器应用程序域的 200 状态表明 CORS 预检成功,但 Firefox 开发者控制台显示:

"https://localdev.net:8443/v1/user/login" TypeError: NetworkError when attempting to fetch resource.

所以应用程序和/或 Firefox 似乎认为请求失败。 Wireshark 显示该应用程序没有向服务器发送另一个请求。我期待一个帖子。

有很多关于 CORS 的问题,但是浏览器/API/服务器变化很大,所以我还没有找到完全匹配的。深入研究它,但任何帮助将不胜感激。

【问题讨论】:

尝试从 Chrome 运行请求,它在开发者控制台中给出了一个额外的错误:“请求标头字段内容类型在预检响应中被 Access-Control-Allow-Headers 不允许。”在此错误之后,它会打印“TypeError: Failed to fetch”。 在 Beego 配置中将 AllowHeaders 设置为“Origin, Content-Type”,但仍然出现相同的错误。 Beego 发送的飞行前响应不包含设置为 'Origin, Content-Type' 的 Access-Control-Allow-Headers。我怀疑它应该。 【参考方案1】:

已修复。需要在 Beego CORS 选项中设置 Access-Control-Allow-Headers 为 []string"Origin", "Content-Type"。然后正确设置 Access-Control-Allow-Headers 并且预检成功。在此之后主帖成功。

【讨论】:

以上是关于在飞行前停止从 Firefox 到 Beego 服务器的 CORS 获取的主要内容,如果未能解决你的问题,请参考以下文章

如何在浏览器的控制台中查看 CORS 飞行前 OPTIONS 请求?

如何从 Web 服务提供飞行前请求

VS2015安装插件时,请求被终止,怎样解决?

JHipster:CORS 在表单登录时失败(实际请求,不是飞行前)

nginx重新加载配置(不停服)

交叉呼叫与 Post 一起工作,但在飞行前失败