2012-07-18 5 views
6

Tôi đang cố gắng cho phép truy vấn AJAX dựa trên this tutorial. Nó đặt tiêu đề yêu cầu trước khi gửi với thông tin ủy quyền thích hợp bằng cách sử dụng thư viện Crypto. Vấn đề tôi gặp phải là các tiêu đề dường như không được đặt theo yêu cầu. Dưới đây là mã của tôi:Ủy quyền tiêu đề jQuery AJAX

beforeSend : function(xhr) { 
    var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
    var base64 = Crypto.util.bytesToBase64(bytes); 
    xhr.setRequestHeader("Authorization", "Basic " + base64); 
}, 
+0

Điều gì khiến bạn nghĩ tiêu đề chưa được đặt? Bạn đã kiểm tra cuộc gọi xhr thực sự chưa? Có thể đặt 'Crypto',' username' hoặc 'password' thành' undefined' không? Bạn cũng có thể sử dụng curl và thiết lập các tiêu đề (-H) và xem nếu không phải là một vấn đề phía máy chủ. BTW, tôi là người đã viết bài đăng trên blog đó ;-) – pdeschen

+0

Tôi đang viết cuộc gọi xhr vào nhật ký, tôi đang tìm gì trong đối tượng? Tôi đã kiểm tra và cả 3 được xác định chính xác. Hiện tại, tôi đang gặp phải lỗi 401 trái phép vì những lý do rõ ràng. Đó là tốt để biết, bài tốt. –

+0

với Chrome, nếu bạn mở Công cụ dành cho nhà phát triển và chọn tab Mạng và sau đó chọn phần tử XHR trong danh sách dưới cùng, bạn có thể kiểm tra các yêu cầu ajax thực, nội dung, tiêu đề và tất cả. – pdeschen

Trả lời

8

Vấn đề này đã không được thiết lập dataType-JSONP. Vì điều này không được thực hiện, trình duyệt sẽ giải thích lời gọi như một yêu cầu AJAX chuẩn có nghĩa là nó đã bị chặn theo chính sách cùng nguồn gốc.

đang làm việc để tham khảo (tín dụng đi vào @pdeschen cho thấy Crpyto):

<script type='text/javascript'> 
// define vars 
var username = ''; 
var password = ''; 
var url = ''; 

// ajax call 
$.ajax({ 
    url: url, 
    dataType : 'jsonp', 
    beforeSend : function(xhr) { 
     // generate base 64 string from username + password 
     var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
     var base64 = Crypto.util.bytesToBase64(bytes); 
     // set header 
     xhr.setRequestHeader("Authorization", "Basic " + base64); 
    }, 
    error : function() { 
     // error handler 
    }, 
    success: function(data) { 
     // success handler 
    } 
}); 
</script> 
+1

Bạn cũng có thể mã hóa tên người dùng và mật khẩu thành base64 bằng 'btoa (tên người dùng +": "+ mật khẩu)' –

+0

@DanielHigueras Nice! Không biết về chức năng này, [có vẻ như nó chỉ có trong IE 10+], nhưng hey .. vít IE –

0

này cuối cùng dường như làm việc cho tôi. Có thể có xung đột trên cơ sở cuộc gọi cá nhân. Đặt phương thức này làm mặc định cho các tùy chọn kết nối trong tương lai.

//Function(jqXHR jqXHR) 
$.ajaxSetup({beforeSend: function(jqXHR) { 
    jqXHR.setRequestHeader("My-Header", "My-Value"); 
} }); 
+2

Có vẻ như 'ajaxSetup' không còn tồn tại, vì vậy tôi đã sử dụng' ajaxSend': \t '$ (tài liệu) .ajaxSend (chức năng (e, xhr, cài đặt) { \t \t xhr.setRequestHeader ("Ủy quyền", "mytoken"); \t}); '. Xem http://api.jquery.com/ajaxSend/ – falsarella