2012-02-07 61 views
72

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 phải theo chuyển hướng.

jQuery's $.ajax dường như luôn theo dõi chuyển hướng. Làm thế nào tôi có thể 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ư "chuyển hướng jquery ajax" nhưng tất cả đều xuất hiện 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ủ cung cấp.

Trả lời

74

Yêu cầu AJAX không bao giờ có cơ hội KHÔNG theo chuyển hướng (nghĩa là phải tuân theo chuyển hướng). Bạn có thể tìm thấy thêm thông tin trong câu trả lời này https://stackoverflow.com/a/2573589/965648

11

jQuery chạy trong giới hạn công cụ javascript của trình duyệt của bạn. Mọi tài nguyên được yêu cầu thông qua các phần tử javascript hoặc html (liên kết, tập lệnh, hình ảnh, âm thanh hoặc video, v.v.) có thể bị chuyển hướng http. Rất tiếc, không có cách nào để javascript truy cập vào http cấp thấp theo cách bạn cần.

Rất tiếc, câu trả lời là không.

4

Trong khi các folks khác, những người đã trả lời câu hỏi này được (buồn bã) đúng khi cho rằng thông tin này được ẩn từ chúng tôi bởi trình duyệt, tôi nghĩ rằng tôi muốn gửi một workaround tôi đã đưa ra:

tôi cấu hình ứng dụng máy chủ của tôi để đặ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 nếu xhr.getResponseHeader("x-response-url") được xác định, trong trường hợp này, nó so sánh nó với url mà ban đầu nó yêu cầu qua $.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 yêu cầu một số trợ giúp phía máy chủ và cũng có thể bị hỏng nếu url bị xóa (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ư hoàn thành công việc.


Về phía server, trường hợp cụ thể của tôi là một ứng dụng python sử dụng khuôn khổ 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 
27

Chào mừng bạn đến tương lai!

Hiện tại, chúng tôi có thuộc tính "responseURL" từ đối tượng xhr. YAY!

Xem How to get response url in XMLHttpRequest?

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

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); 
    } 
}); 

Nó không phải là một giải pháp làm sạch và tôi cho rằng jQuery đội sẽ làm một cái gì đó cho responseURL trong phiên bản tương lai.

TIP: 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 đó là "không xác định" thì responseUrl có thể 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 theo chuyển hướng nhưng bạn có thể giải quyết một số nhiệm vụ bằng cách sử dụng thuộc tính responseUrl.

-11
$.ajax({ 
type: "POST", 
url: "http://arudhrainnovations.com/android/testregister.php", 
data: dataString, 
dataType: "json", 
cache: false, 
success: function(result){ 
     alert(result); 
     } 
} 
if (result.success==1) 
{ 
    windows.locations = "index.html"; 
    return; 
} 

Để chuyển hướng tệp sau khi phản hồi json từ máy chủ trực tiếp. kiểm tra thẻ respone success ==1 và đặt mã bên dưới để chuyển hướng.

windows.locations = "index.html";

Xin vui lòng cho tôi biết thêm chi tiết tại [email protected]

+1

Bộ luật này sẽ không bao giờ làm việc bro ... – brothers28

+0

Chúc may mắn với điều đó –

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