Hãy theo tôi, điều này cần một chút giải thích.Thông tin đăng nhập cookie CORS từ WebView trên thiết bị di động được tải cục bộ bằng tệp: //
Tôi đang giúp xây dựng một ứng dụng web di động lai. Các codebase chính là HTML5 và JavaScript, mà sẽ được bao bọc trong một Web View di động bản địa (a la Phonegap).
Một phần chức năng yêu cầu ứng dụng đăng thông tin lên dịch vụ web do một trong những khách hàng của chúng tôi kiểm soát. Có rất ít phạm vi để thay đổi dịch vụ web này vì nó đang được người khác sử dụng. Chúng tôi gửi JSON bằng cách sử dụng HTTP POST và nhận phản hồi từ máy chủ. Một phần của phản hồi này là một cookie JSESSIONID quản lý phiên của chúng tôi với máy chủ. Sau cuộc gọi initSession()
ban đầu, chúng tôi cần gửi cookie JSESSIONID với mọi yêu cầu (AJAX).
Khi được triển khai trên thiết bị di động, ứng dụng web được bao bọc trong Chế độ xem web gốc, khởi chạy ứng dụng web bằng cách duyệt đến file:///path/to/app/index.html
.
Điều đầu tiên chúng tôi đã thử là yêu cầu khách hàng đặt Access-Control-Allow-Origin: *
trong tiêu đề phản hồi của họ để cho phép CORS. Sau đó, chúng tôi đã cố đăng bài lên máy chủ:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
Giám sát các yêu cầu, rõ ràng là cookie không được đưa vào. Khi kiểm tra kỹ hơn, có special section in the CORS spec for dealing with user credentials, bao gồm cookie phiên. Vì vậy, tôi đã sửa đổi cuộc gọi AJAX để bao gồm điều này:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
Một lỗi khác, lần này từ Trình duyệt. Đọc thêm mang lại những điều sau đây:
Nếu máy chủ của bên thứ ba không phản hồi với tiêu đề
Access-Control-Allow-Credentials: true
, phản hồi sẽ bị bỏ qua và không được cung cấp cho nội dung web.Lưu ý quan trọng: khi trả lời yêu cầu được chứng nhận, máy chủ phải chỉ định miền trong tiêu đề
Access-Control-Allow-Origin
và không thể sử dụng tính năng gắn thẻ tự nhiên.
Vì vậy, chúng tôi cần thay đổi tiêu đề của máy chủ để bao gồm Access-Control-Allow-Credentials: true
và Access-Control-Allow-Origin
đối với Nguồn gốc của chúng tôi.
Ở đây chúng tôi cuối cùng đã gặp sự cố của mình: when loading a web page using the file:// protocol, tiêu đề yêu cầu Origin
được gửi từ Chế độ xem web được đặt thành null
. Do đó nó không thể được phân tích bởi máy chủ và do đó máy chủ không thể đặt nó trong Access-Control-Allow-Origin
. Nhưng nếu máy chủ không thể đặt Access-Control-Allow-Origin
thành một thứ khác không phải là *
, chúng tôi không thể gửi bằng chứng xác thực, bao gồm cả cookie.
Vì vậy, tôi bị kẹt. Phải làm gì? I saw a similar question posted here nhưng tôi không thực sự hiểu câu trả lời được đề xuất. Bất kì sự trợ giúp nào đều được đánh giá cao!
Giải pháp duy nhất tôi có thể nghĩ là sử dụng máy chủ để truy cập dịch vụ web. Bạn có thể viết trình xử lý HTTP và nhấn vào trình xử lý đó từ ứng dụng dành cho thiết bị di động của mình. Rõ ràng điều này cho biết thêm chi phí bổ sung trong bảo trì máy chủ nhưng bạn phải có một cái gì đó có sẵn, không? –
Vâng, đó là giải pháp tạm thời, một cửa sổ trung gian curl php khó chịu. Nó thực sự không phải là lý tưởng, nhưng ít nhất là làm việc trong thời gian này. – fiznool
Một điều tôi có thể làm là hỏi các nhà phát triển phonegap nếu họ đã thấy bất cứ điều gì như thế này trước đây và có cách giải quyết ... – fiznool