2016-03-05 47 views
6

我在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 /服務器變化很大,所以我沒有找到完全匹配。挖掘它,但任何幫助,將不勝感激。

+0

嘗試從Chrome運行請求,並且在開發者控制檯中給出了一個額外的錯誤:「預檢響應中的Access-Control-Allow-Headers不允許請求標頭字段內容類型。發生此錯誤後,它會打印「TypeError:無法提取」。 –

+0

在Beego配置中將AllowHeaders設置爲「Origin,Content-Type」,但仍然出現相同的錯誤。 Beego發送的飛行前響應不包含設置爲「Origin,Content-Type」的Access-Control-Allow-Headers。我懷疑它應該。 –

回答

3

固定。需要在Beego CORS選項中將Access-Control-Allow-Headers設置爲[] string {「Origin」,「Content-Type」}。然後,Access-Control-Allow-Headers被正確設置,並且預先成功。之後主帖成功。