2016-03-05 13 views
6

Tôi có một ứng dụng trình duyệt ecmascript 7 chạy trên http://localhost:3000 trong trình duyệt Firefox 44.0.2. Nó được gửi đến một máy chủ Beego 1.6.0 chạy trên https://localdev.net:8443. Các 'localdev.net' là trên cùng một hộp và giải quyết đến địa chỉ localhost. Mã trình duyệt là:CORS tìm nạp từ Firefox đến máy chủ Beego dừng sau chuyến bay trước

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())) 

}

Máy chủ beego được cấu hình để xử lý yêu cầu CORS như sau:

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

Wireshark thấy các khách hàng gửi một trước chuyến bay tùy chọn CORS yêu cầu đến máy chủ:

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 

Để phản hồi, máy chủ đầu ra beego:

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

Mặc dù các máy chủ nói 'không phù hợp', Wireshark ghi lại một phản ứng:

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 

Đối với tôi, tình trạng 200 với một Access-Control-Allow-Origin thiết vào miền ứng dụng trình duyệt cho biết rằng chuyến bay trước CORS đã thành công, nhưng bảng điều khiển dành cho nhà phát triển Firefox hiển thị:

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

Vì vậy, ứng dụng và/hoặc Firefox dường như nghĩ rằng yêu cầu không thành công. Wireshark cho thấy ứng dụng không gửi yêu cầu khác tới máy chủ. Tôi đang chờ một bài đăng.

Có rất nhiều câu hỏi về CORS ở đó, nhưng trình duyệt/API/máy chủ có nhiều biến đổi nên tôi không tìm thấy kết quả khớp chính xác. Đào vào nó, nhưng bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Đã cố gắng chạy yêu cầu từ Chrome và nó cung cấp thêm lỗi trong bảng điều khiển dành cho nhà phát triển: "Không cho phép loại nội dung trường tiêu đề yêu cầu bởi Access-Control-Allow-Headers trong phản hồi preflight". Sau lỗi này, nó in "TypeError: Failed to fetch". –

+0

Đặt AllowHeaders thành "Origin, Content-Type" trong cấu hình Beego, nhưng vẫn gặp lỗi tương tự. Phản hồi trước chuyến bay do Beego gửi không chứa Access-Control-Allow-Headers được đặt thành 'Origin, Content-Type'. Tôi nghi ngờ nó nên. –

Trả lời

3

Đã sửa lỗi. Cần đặt Access-Control-Allow-Headers thành [] string {"Origin", "Content-Type"} trong tùy chọn Beego CORS. Sau đó, Access-Control-Allow-Headers được đặt đúng và chuyến bay trước thành công. Sau đó bài đăng chính thành công.

Các vấn đề liên quan