Подтвердить что ты не робот

AJAX перенаправление дилеммы, как получить URL перенаправления или как установить свойства для запроса перенаправления

Во-первых, я работаю в Google Chrome, если это помогает. Вот поведение:

Я отправляю запрос xhr через jQuery на удаленный сайт (это расширение chrome, и я установил все настройки межсайтового сайта...):

$.ajax({
    type: "POST",
    contentType : "text/xml",
    url: some_url,
    data: some_xml,
    username: user,
    password: pass,
    success: function(data,status,xhr){
        alert(data);
    },
    error: function(xhr, status, error){
        alert(xhr.status);
    }
});

Установленный URL возвращает 302 (это ожидается), а Chrome следует за перенаправлением (также ожидается).

Новый URL-адрес возвращает приглашение для учетных данных, которые не извлекаются из исходного запроса, поэтому Chrome показывает диалоговое окно входа в систему. Если я поставлю исходные учетные данные, я верну ответ о некорректном запрошенном отправлении (это действительный HTTP-запрос - 200 - удаленный сервер просто не любит один из заголовков).

При просмотре окна разработчика в Chrome отправляются два запроса. Первый - это исходный URL со всеми настройками, заданными в запросе AJAX. Второй - URL перенаправления с методом "GET", ничего из поля "POST" и никаких учетных данных.

Я не понимаю, что я могу сделать. Мне нужно:

  • Получите URL-адрес перенаправления, чтобы я мог отправить второй запрос (xhr.getResponseHeader("Location") НЕ работает),

  • Попросите новый запрос перенаправления сохранить настройки из исходного запроса или

  • Получите окончательный URL-адрес, из-за которого произошла ошибка, поэтому я могу отправить другой запрос.

В идеале я не хочу, чтобы пользователь во второй раз вставлял свои учетные данные в это диалоговое окно, но я возьму то, что могу получить, если могу получить окончательный URL.

4b9b3361

Ответ 1

Исходя из вашего вопроса, я не совсем уверен, ссылаетесь ли вы на HTTP-аутентификацию или на схему проверки подлинности на основе формы, и поэтому я буду обращаться к обоим.

Получите URL-адрес перенаправления, чтобы я мог отправить второй запрос (xhr.getResponseHeader( "Location" ) НЕ работает),

С тем, как XHR построен вообще (и в Chrome конкретно): XHR не очень гибкий и обеспечивает относительно высокий уровень API, с тем же самым поведением браузера во всех других запросах (URL-адреса адресной строки, URL-адреса источника изображения, встроенные URL-адреса script), т.е. Перенаправления обрабатываются прозрачно. В JavaScript, предупреждающем вас об этом переадресации или промежуточных кодах состояния 302/301, не будет передано никаких событий, вы получите только окончательный код состояния и данные. Поэтому невозможно получить заголовок "Location" из ответа, так как окончательный ответ не будет содержать заголовок "Местоположение".

Попросите новый запрос переадресации сохранить настройки из исходного запроса,

XHR не предоставляет это как опцию, и это будет неправильное поведение по умолчанию. Пример, почему это было бы и не должно происходить по умолчанию:

Acme corp предоставляет службу коротких ссылок для своих сотрудников. Я нажимаю на короткую ссылку, которую я получаю от сотрудника, и мне предлагается HTTP-проверка подлинности службой короткой ссылки Acme. Перенаправление происходит после этой аутентификации. Нет причин, по которым перенаправляемый сайт должен запрашивать мои учетные данные, и поэтому было бы неправильным поведением браузера передавать эту информацию (и на самом деле проблему безопасности). Точно так же данные POST не должны пересылаться, поскольку они могут быть предназначены только для потребления по предварительному URL-адресу.

Получите окончательный URL-адрес, из-за которого возникла ошибка, поэтому я могу отправить другой запрос.

К сожалению, по соображениям безопасности и определению стандартов стандартный объект XHR (включая тот, который использует Chrome для межсайтовых запросов в расширениях) не предоставляет никакого способа доступа к окончательному URL-адресу, который имеет ошибку. Вы можете получить доступ только к окончательному состоянию HTTP и любым данным, возвращаемым конечным URL.

-

Учитывая это, у вас есть несколько вариантов в зависимости от того, сколько у вас контроля над ситуацией:

1) Если у вас есть контроль над сервером перенаправления, подумайте о включении информации. в ваших запросах AJAX, указывающих клиента AJAX, и вместо этого сервер возвращает данные (т.е. объект json), указывающий на необходимость перенаправления.

Или, если это намерение всегда передавать данные аутентификации, рассмотрите возможность внедрения некоторого механизма для передачи сеанса или включения информации аутентификации. в URL-адресе, перенаправленном так, чтобы целевой URL-адрес мог использовать эту информацию.

2) Если у вас есть контроль над пунктом назначения перенаправления, включите URL-адрес получателя при создании страницы с ошибкой аутентификации. Объект XHR будет иметь доступ к этим данным ответа и может проанализировать его, чтобы продолжить новый запрос.

3) Если у вас нет контроля над сайтом перенаправления или целевым сайтом, рассмотрите возможность размещения прокси-сервера для обработки запросов и улавливания 302.

http://myserver/?url=http://redirectsite.com&user=...&pass=...

4) Если ни одна из вышеперечисленных функций не является параметром, наименее желательным, но жизнеспособным вариантом является создание расширения NPAPI для Chrome, на котором выполняется собственный код. Это даст вам полный контроль над запросами и позволит вам сделать что угодно. Однако обратите внимание, что это связано с более сложным развитием, потенциальными проблемами безопасности и меньшей желательностью пользователя.

Ответ 2

К сожалению, нет способа предотвратить xhr от автоматических переадресаций или установить учетные данные для адресата перенаправления (в любом случае это будет довольно неуверенно, поскольку это позволит первому сайту перенаправить учетные данные любому сайт, а не только тот, который вы хотите получить).

Ответ 3

Вы можете попробовать тип решения, описанного здесь: Как управлять запросом перенаправления после вызова jQuery Ajax

Это означает, что фактически заменяет протокол HTTP, вам также нужно будет управлять сервером. Все ответы ajax будут в коде 200 (или, по крайней мере, 3xx, а не 401/403) с json-объектом. и в этом json-объекте вы можете предоставить некоторый специальный код ошибки (почему бы не повторное использование

Затем вы расширяете функцию jQuery.ajax для захвата специальных кодов в вашем ответе json и требуете новых запросов. На самом деле автоматический вызов jQuery перенаправления выполняется вами, а не jQuery.

вначале это кажется уродливым, но при решении проблем, подобных предложенным в ссылке (конец сеанса, переадресация на странице входа), кажется, что полная обработка протокола в вашей связи ajax json между клиентом и сервером это не плохая идея.

Ответ 4

В случае, если вы управляете сервером, вы можете вставлять данные, потерянные в самом адресе перенаправления. Таким образом, xhr делает POST, а затем выполняет GET с некоторыми из данных POSTed, которые были закодированы обратно (сервером) в качестве параметров GET. Никакие другие решения не подходят для меня...

Ответ 5

Как сказал ранее Раджив М., вы не можете перехватить 302 перенаправления, используя объект XHL Object или AJAX.

Лучше всего настроить прокси-сервер какого-либо типа в PHP/ASP или на любом языке сценариев на стороне сервера. PHP script будет просто следовать 302 переадресациям, пока не достигнет конечного адресата. Затем он может отправить окончательный URL-адрес обратно на вашу страницу JavaScript. Теперь будущие запросы AJAX могут быть отправлены непосредственно на известный конечный URL.

Или...

Ваш PHP script будет просто служить прокси. Все запросы будут отправлены на этот PHP скрипт.

Или...

Просто скопируйте конечный URL-адрес в ваше приложение JavaScript, если это возможно (хотя я предполагаю, что это невозможно в вашем случае).

Извините - мне тоже не нравятся ответы "вы не можете этого", но есть некоторые ограничения JavaScript, которые еще не были полностью устранены.

Ответ 6

Вы не можете использовать windows.location = "newURL"? который работал у меня для перенаправления