Phát hiện chuyển hướng trong yêu cầu ajax?


94

Tôi muốn sử dụng jQuery để NHẬN URL và kiểm tra rõ ràng xem nó có phản hồi với chuyển hướng 302 hay không, nhưng không thực hiện theo chuyển hướng.

jQuery's $.ajaxdường như luôn tuân theo các chuyển hướng. Làm cách nào để ngăn chặn điều này và xem chuyển hướng mà không theo dõi nó?

Có nhiều câu hỏi khác nhau với tiêu đề như "jquery ajax redirect" nhưng tất cả đều liên quan đến việc hoàn thành một số mục tiêu khác, thay vì chỉ trực tiếp kiểm tra trạng thái mà máy chủ đưa ra.

Câu trả lời:



41

Chào mừng đến với tương lai!

Ngay bây giờ chúng ta có thuộc tính "responseURL" từ đối tượng xhr. ĐƯỢC!

Xem Cách lấy url phản hồi trong XMLHttpRequest?

Tuy nhiên, jQuery (ít nhất là 1.7.1) không cấp quyền truy cập trực tiếp vào đối tượng XMLHttpRequest. Bạn có thể sử dụng một cái gì đó như sau:

var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
  xhr = _orgAjax();
  return xhr;
};

jQuery.ajax('http://test.com', {
  success: function(responseText) {
    console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
  }
});

Đó không phải là một giải pháp sạch và tôi cho rằng nhóm jQuery sẽ tạo ra một thứ gì đó cho responseURL trong các bản phát hành trong tương lai.

MẸO : chỉ cần so sánh URL gốc với responseUrl. Nếu nó bằng nhau thì không có chuyển hướng nào được đưa ra. Nếu nó là "không xác định" thì có thể responseUrl không được hỗ trợ. Tuy nhiên, như Nick Garvey đã nói, yêu cầu AJAX không bao giờ có cơ hội KHÔNG tuân theo chuyển hướng nhưng bạn có thể giải quyết một số tác vụ bằng cách sử dụng thuộc tính responseUrl .


1
Để thêm một số tài nguyên khác trên thuộc tính này - trang MDN trên XHR.responseURL - hỗ trợ chung dường như đang chờ trên MSIE, trang này chỉ được thêm vào trong Edge / 14.
Eli Collins

Cảm ơn ! Rất hữu ích
Gautier

Tôi thấy rằng mã này thực sự khiến cho $ .ajax ({url: 'someurl', xhrFields: {withCredentials: true}}) gặp lỗi trong Internet Explorer vì hàm _orgAjax phụ thuộc vào biến 'this' phân giải thành $ .ajaxSettings vật. Khi không, jQuery tạo đối tượng ActiveX IXMLHTTPRequest thay vì đối tượng XMLHttpRequest, đối tượng này không hỗ trợ thuộc tính withCredentials. Tôi đã sửa lỗi này bằng cách gọi xhr = _orgAjax.call ($. AjaxSettings); thay vì xhr = _orgAjax (); Tôi hi vọng điêu nay se giup được ai đo.
StephenKC

11

Mặc dù những người khác đã trả lời câu hỏi này (thật đáng buồn) chính xác rằng thông tin này bị trình duyệt ẩn với chúng tôi, tôi nghĩ rằng tôi sẽ đăng một giải pháp mà tôi đã nghĩ ra:

Tôi đã định cấu hình ứng dụng máy chủ của mình để đặt tiêu đề phản hồi tùy chỉnh ( X-Response-Url) chứa url được yêu cầu. Bất cứ khi nào mã ajax của tôi nhận được phản hồi, nó sẽ kiểm tra xem xhr.getResponseHeader("x-response-url")có được xác định hay không, trong trường hợp đó nó sẽ so sánh nó với url mà nó đã yêu cầu ban đầu $.ajax(). Nếu các chuỗi khác nhau, tôi biết đã có một chuyển hướng và thêm vào đó, chúng tôi thực sự đã truy cập vào url nào.

Điều này có nhược điểm là yêu cầu một số trợ giúp từ phía máy chủ và cũng có thể bị hỏng nếu url bị thay đổi (do vấn đề trích dẫn / mã hóa, v.v.) trong suốt chuyến đi ... nhưng đối với 99% trường hợp, điều này dường như xảy ra công việc đã hoàn thành.


Về phía máy chủ, trường hợp cụ thể của tôi là ứng dụng python sử dụng khung web Pyramid và tôi đã sử dụng đoạn mã sau:

import pyramid.events

@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
    request = event.request
    if request.is_xhr:
        event.response.headers['X-Response-URL'] = request.url

Đúng là thực sự không có cách nào để biết nếu có một chuyển hướng mà không có nó; nhưng có thể so sánh URL tiêu đề dự kiến ​​với URL được chuyển hướng có thể là một giải pháp cho tôi vào lúc này. Cảm ơn vì ý tưởng
Sergio A.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.