2012-03-11 26 views
18

Vì jQuery ajax ist không hoạt động cho CORS/IE, tôi đang sử dụng XDomainRequest để truy xuất dữ liệu từ Máy chủ khác. Làm việc tốt, nhưng tôi muốn gửi một số tiêu đề ('Authentification', 'content-type').tiêu đề nguồn gốc chéo trong IE8/IE9

Có cơ hội thêm/thay đổi tiêu đề trong XDomainRequest không?

Hoặc ai đó biết cách giải quyết?

Trả lời

17

Đây là những gì chúng tôi đã làm cho IE.

Nếu bạn có quyền kiểm soát miền mục tiêu, hãy lưu trữ tệp html (tĩnh) tại đó. Bao gồm html bằng iframe.

Bây giờ iframe này thực sự có quyền truy cập vào miền địa phương, vì vậy bạn có thể liên lạc giữa khung phụ huynh và khung con để nhận những gì bạn cần.

Điều này đã làm việc nhiều hơn tốt hơn XDomainRequest đối với chúng tôi.

window.postMessage là cách tốt nhất để thiết lập các thông tin liên lạc:

Nhưng tôi khá chắc chắn rằng chỉ bắt đầu làm việc kể từ khi IE8. Nếu bạn yêu cầu các trình duyệt cũ hơn, bạn phải sử dụng một bản hack khác.

Trong trường hợp của chúng tôi, đây là hệ thống 3-lớp của chúng tôi:

  1. CORS, cho các trình duyệt có hỗ trợ nó
  2. Một iframe & window.postMessage như một dự phòng chính
  3. Một proxy server-side tập lệnh dưới dạng dự phòng phụ

Tất cả các tùy chọn này hoạt động tốt, đáng tin cậy và không cảm thấy quá nhiều. Dự phòng thứ cấp hầu như không bao giờ được sử dụng.

Hãy nhớ rằng tiêu đề 'Xác thực' đặc biệt là đặc biệt và tôi sẽ không bị sốc khi bị chặn trong một số trường hợp nhất định. Chúng tôi đã thêm tiêu đề tùy chỉnh 'X-Authenticate' vì nó đã vượt qua mọi lúc.

+0

Tôi đã xem xét giải pháp iframe trong những ngày qua. Nhưng vì bạn phải đặt 'document.domain', có vẻ như nó chỉ hoạt động cho giao tiếp giữa hai tên miền phụ của cùng một TLD. Nhưng còn hai TLD khác nhau thì sao? (Tôi có thể phải digg sâu hơn vào công cụ proxy-server vào cuối tuần ...) –

+0

Giải pháp iframe * nên * hoạt động nếu khung nội tuyến được lưu trữ trên cùng một miền với API. Nếu một kịch bản proxy là một giải pháp cho bạn, điều đó có thể được * nhiều * dễ dàng hơn cho các mục đích của bạn. Lưu ý rằng đó là (thường) không quá nhiều proxy-server, vì nó chỉ là một kịch bản proxy phía máy chủ. – Evert

+0

ok, tôi đã thực hiện công việc iframe. Tôi đang truyền một đối tượng với tất cả thông tin (tiêu đề, hậu thân, ...) đến cửa sổ khung, thực hiện các yêu cầu và trả về phản hồi. :) Về kịch bản proxy: Nếu tôi lưu trữ tập lệnh trên API-Server, tôi vẫn sẽ phải gửi yêu cầu với các tiêu đề trong Ajax. Vì vậy, kịch bản sẽ được trên cùng một máy chủ như trang 'request'-? (=^khách hàng)? Bằng cách này, IE cho phép tôi gửi tiêu đề, nội dung, v.v. và proxy gửi yêu cầu tới api-server (curl)?!? –

2

XDomainRequest của IE không cho phép đặt tiêu đề tùy chỉnh. Xem mụC# 3 ở đây: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx Đối tượng XDomainRequest bị khóa xuống đến điểm khó thực hiện yêu cầu được xác thực.

+1

Nhưng phải có cách giải quyết!?! Hoặc là IE tồi tệ hơn tôi nghĩ? –

+1

Nếu không có khả năng đặt tiêu đề hoặc cookie tùy chỉnh, tôi không chắc chắn về cách thực hiện yêu cầu được xác thực tốt. Bạn có thể chuyển thông tin xác thực xác thực làm tham số truy vấn (Tôi tin rằng luồng tác nhân người dùng OAuth2 cho phép điều này), tuy nhiên điều này có thể không an toàn (và nên được thực hiện qua SSL). Xin lỗi, có thể ai đó khác có câu trả lời hay hơn :-) – monsur

+0

Tôi nghĩ bạn chỉ cần họ đăng nhập vào trang web tên miền khác. (do đó, thiết lập các cookie phiên thích hợp và các tiêu đề xác thực). Sau đó, XDomainRequest của bạn sẽ sử dụng phiên họ thiết lập? Tôi có thể đã sai. –

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