2013-08-28 24 views
14

Tôi đang viết một tập lệnh JS nằm trong một hệ thống hiện đang thêm tiêu đề XID tùy chỉnh vào tất cả các yêu cầu Ajax qua jqXHR.setRequestHeader() trong một hàm được đăng ký với jQuery.ajaxPrefilter().Có cách nào để loại bỏ các tiêu đề Ajax được thiết lập bởi setRequestHeader() không?

Trong tập lệnh, tôi cần thực hiện một yêu cầu Ajax đến trang web của bên thứ ba, có Access-Control-Allow-Headers không được thiết lập để cho phép tiêu đề XID tùy chỉnh này.

Dường như tôi có 3 lựa chọn:

  1. Tìm một cách để loại bỏ tiêu đề XID trong $ .ajax()’s chức năng beforeSend, mà tôi đã khẳng định được gọi sau khi ajaxPrefilter() chức năng.
  2. Forgo sử dụng $ .ajax() hoàn toàn và chỉ tự viết những thứ Ajax.
  3. Có $ .ajax() trỏ tới phần cuối của hệ thống, chấp nhận tiêu đề XID tùy chỉnh và thực hiện yêu cầu tới trang web của bên thứ ba thông qua cURL.

Tùy chọn # 1 được ưu tiên, nếu có cách đơn giản để thực hiện, vì đó sẽ là tuyến đường sạch nhất và nhanh nhất. Chỉ cần không thể tìm ra cách.

Tôi đã cố gắng trọng nó như thế này, nhưng nó đã không làm việc:

beforeSend: function(jqXHR, settings) { 
    jqXHR.setRequestHeader('custom-xid-header', null); 
} 

Bất kỳ ý tưởng?

+0

Khá chắc chắn điều này là không thể (không may). Tôi cảm thấy như thế này là dễ dàng để vượt qua, nhưng sẽ cần phải được thay đổi bởi jQuery. 'JqXHR' là một đối tượng bao bọc cho một' XMLHttpRequest' thực sự. Tất cả jQuery cần làm là theo dõi bất kỳ tiêu đề thêm/tùy chỉnh nào (như trong 'Object') và sử dụng các phương thức như' removeHeader' và 'setHeader' để sửa đổi đối tượng đó. Sau đó, khi yêu cầu thực sự được tạo và gửi đi, đối tượng đó sẽ được sử dụng để * thực sự * thêm tiêu đề yêu cầu vào yêu cầu thực. Tôi đoán tùy thuộc vào dòng công việc thực tế/vòng đời trong nội bộ, nó có thể hoặc không thể là – Ian

+0

Chuột, đó là những gì tôi sợ. –

+0

Có vẻ như đặt giá trị là 'null' hoặc' "" 'chỉ đặt giá trị trống ... không xóa toàn bộ tiêu đề. Nó có thể không phải là một ý tưởng tồi để gửi một yêu cầu tính năng cho jQuery. Và sử dụng điều này làm ví dụ. Một lần nữa, nó có thể hoặc không thể có thể tùy thuộc vào vòng đời trong nội bộ – Ian

Trả lời

2
$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
     jqXHR.setRequestHeader('custom-xid-header', null); 
    } 
}) 

thấy http://api.jquery.com/jQuery.ajaxSetup/

+2

Đó không phải là những gì OP đã cố gắng và không hoạt động? – Bergi

+2

Câu trả lời đúng là http://stackoverflow.com/questions/2464192/how-to-remove-http-specific-headers-in-javascript –

+0

@AramKocharyan no, bởi vì điều đó không _remove_ tiêu đề – randomsock

0

Overiding dường như không để làm việc nhưng có một sửa chữa đơn giản.

$.ajaxSetup({ 
     beforeSend: function (jqXHR) { 
      if (sendToken == true) 
       jqXHR.setRequestHeader("Authorization", cookie); 
      return true; 
     } 
    }); 

Kiểm tra biến số sendToken. Đó là toàn cầu. Khi bắt đầu ứng dụng của tôi, tôi luôn đặt nó thành sự thật bởi vì tôi cần tiêu đề đặt ở mọi nơi.

Nhưng khi tôi không muốn gửi "Authorization" tiêu đề tôi chỉ cần vượt qua toàn cầu sendToken-sai trước bất kỳ yêu cầu có thể đi. Khi tất cả yêu cầu được thực hiện, tôi chỉ cần đặt lại thành đúng một lần nữa ...

Bí quyết là biến jqXHR là địa phương và không giữ giá trị được gán mỗi lần. Và việc so sánh giá trị hiện tại được đặt trong ajaxSetup không hoạt động vì nó luôn thêm giá trị mới thay vì chỉ thay thế giá trị đó. Có một điều kiện trên đầu trang của nó là tôi nghĩ rằng cách đơn giản và hiệu quả nhất.

Nó làm việc cho tôi.

0

Điều này sẽ xóa tập hợp tiêu đề bằng $ .ajaxSetup(). Tôi đoán nó sẽ làm việc với beforeSend() là tốt.

delete $.ajaxSettings.headers["custom-xid-header"] 
3

Tôi nhận thấy đây là một chuỗi cũ nhưng vẫn là vấn đề! Hy vọng sau đây sẽ giúp giải quyết nó cho người khác như nó đã cho chúng tôi.

Thiết lập một tiêu đề để null/undefined/"" sau khi nó được thiết lập không không gỡ bỏ nó, nó sẽ gửi header vẫn nhưng với một trong hai không có giá trị hoặc "không xác định" hoặc "vô giá trị". Đây có lẽ là không bao giờ những gì bạn muốn, và trong trường hợp của chúng tôi, hoàn toàn vít SSO khi đó là tiêu đề ủy quyền.

Giải pháp chúng tôi đưa ra dựa trên kết hợp gợi ý @ marlar (cảm ơn) và thiếu hụt jQuery khác: Bạn chỉ có thể có móc ONE beforeSend() và móc mới thay thế trước đó. Dường như điều này cũng đúng nếu bạn cung cấp một số beforeSend() trong yêu cầu $.ajax() cụ thể - nó sẽ ghi đè bất kỳ yêu cầu mặc định nào trong số $.ajaxSetup(). Bằng cách đó, bạn ngăn chặn móc mặc định đặt tiêu đề. (Nó không phải là 100% lý tưởng vì có thể có những thứ khác được thực hiện trong mặc định beforeSend() mà sau đó sẽ không xảy ra, nhưng hey).

Vì vậy, đây phản ứng với cả hai tiêu đề tĩnh và động thiết lập cho một yêu cầu cụ thể:

if($.ajaxSettings && $.ajaxSettings.headers) { 
    delete $.ajaxSettings.headers.Authorization; 
} 
$.ajax({ 
    beforeSend: function() {}, // no op 
    // ... 
}); 

Bạn không thể làm tương tự cho prefilter(), nhưng tôi nghĩ beforeSend() là cách phổ biến hơn làm dù sao đây .