2013-01-04 26 views
7

Tôi đã thực hiện một số nghiên cứu trên internet, nhưng tôi không quản lý để có được bức tranh hoàn chỉnh về chủ đề này. Bất cứ ai có thể giúp đỡ để giải quyết câu trả lời này cho bây giờ và mãi mãi?Tôi có thể đặt tiêu đề trong yêu cầu json miền chéo không?

Đây là những gì tôi tìm thấy cho đến nay:

  • Có thể làm cuộc gọi miền chéo với jsonp. Thay đổi tiêu đề trong cuộc gọi jsonp không bao giờ được phép
  • Có thể thực hiện cuộc gọi tên miền chéo với json nếu máy chủ cho phép.

Đây là những gì tôi đang cố gắng để làm:

$.ajax({ 
    type: "GET", 
    crossDomain: true, 
    beforeSend: function (request) { 
     request.setRequestHeader("Authorization", "Bearer " + ($("#accesstoken").val())); 
    }, 
    contentType: "application/json; charset=utf-8", 
    url: myJSonServer + encodeURI(operation), 
    dataType: 'json', 
    cache: false, 
    success: callback, 
    error: function (jqXhr, textStatus, errorThrown) { alert(textStatus + ": " + errorThrown); } 
}); 

Đây là những gì đang xảy ra:

  • Khi myJSonServer là trên cùng một tên miền, không có vấn đề gì cả
  • Khi myJSonServer nằm trên một tên miền khác, yêu cầu được gửi đi, nhưng không có tiêu đề Bearer

Tiêu đề bộ râu này là một phần của tiêu chuẩn oAuth2.

Tôi nhận thức được thực tế rằng có lẽ đây không phải là giải pháp tốt nhất, thiết lập accessToken trong Trình duyệt. Và tôi biết tôi có thể sử dụng proxy cho tình huống này.

Tôi chỉ tò mò nếu có hoặc sẽ có thể đặt tiêu đề trên yêu cầu json giữa nhiều miền?
Cảm ơn

- Vấn đề giải quyết

Tôi đã sử dụng MVC4 và thêm crossDomainScriptAccessEnabled = "true" trong web.config. Tôi nghĩ điều này sẽ là đủ, nhưng câu trả lời của apsillers đã giải quyết được vấn đề của tôi. Bây giờ tôi đã bổ sung này trong web.config của tôi:

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Authorization" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
+0

Bản sao có thể có của [header-Authorization'-cross-origin 'với jquery.ajax()] (http://stackoverflow.com/questions/9559947/cross-origin-authorization-header-with-jquery-ajax). – apsillers

Trả lời

10

Với JSONP, không thể đặt tiêu đề tùy chỉnh.

Với CORS, máy chủ phải gửi tiêu đề Access-Control-Allow-Headers để cho phép tiêu đề yêu cầu không phổ biến từ ứng dụng khách. Từ số HTML5 Rocks CORS page:

Access-Control-Allow-Headers ... - Danh sách được phân tách bằng dấu phẩy của tiêu đề yêu cầu được hỗ trợ.

Do đó, máy chủ của bạn phải gửi Access-Control-Allow-Headers: Authorization để cho trình duyệt biết được phép gửi Authorization đến máy chủ theo yêu cầu.Nếu không có tiêu đề này, trình duyệt sẽ chỉ gửi một vài tiêu đề chung với yêu cầu và bỏ qua phần còn lại.

1

Kể từ khi "jsonp" hoạt động bằng cách tạo ra một thẻ script và sử dụng thuộc tính src= để tải tài nguyên từ miền khác. Vì vậy, tôi không nghĩ rằng có một cách để sửa đổi các tiêu đề yêu cầu.

0

Nếu bạn đang sử dụng JSONP để thực hiện yêu cầu đa nguồn gốc - thì câu trả lời là không, bạn không thể đặt tiêu đề HTTP theo yêu cầu như vậy. Nếu bạn đang sử dụng CORS để thực hiện yêu cầu có nguồn gốc chéo - thì câu trả lời là có, vì bạn đang sử dụng XHR đơn giản để thực hiện yêu cầu: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing.