我在Firefox 44.0.2浏览器上运行了一个在http://localhost:3000上运行的ecmascript 7浏览器应用程序。它发布到在https://localdev.net:8443上运行的Beego 1.6.0服务器。 'localdev.net'位于同一个盒子上,并解析为本地主机地址。浏览器的代码是:CORS从Firefox取回到Beego服务器在飞行前停止
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请求到服务器:
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
对我来说,与访问控制允许来源的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:无法提取”。 –
在Beego配置中将AllowHeaders设置为“Origin,Content-Type”,但仍然出现相同的错误。 Beego发送的飞行前响应不包含设置为“Origin,Content-Type”的Access-Control-Allow-Headers。我怀疑它应该。 –