У меня есть страница HTML, которая должна выполнить запросы к защищенному от CAS (Сервис Централизованной аутентификации) веб-сервис с помощью функций Ajax jQuery. У меня есть следующий код:
$.ajax({
type: "GET",
url: request,
dataType: "json",
complete: function(xmlHttp) {
console.log(xmlHttp);
alert(xmlHttp.status);
},
success: handleRedirects
});
request
переменная может быть любой к серверу CAS (https://cas.mydomain.com/login?service=myServiceURL
) или непосредственно к сервису (который должен затем перенаправить назад к CAS для получения сервисного билета). Firebug показывает, что запрос выполняется и что он возвращается как 302 перенаправления. Однако $.ajax()
функция не обрабатывает перенаправление.
Я записал эту функцию для работы вокруг этого:
var handleRedirects = function(data, textStatus) {
console.log(data, textStatus);
if (data.redirect) {
console.log("Calling a redirect: " + data.redirect);
$.get(data.redirect, handleRedirects);
} else {
//function that handles the actual data processing
gotResponse(data);
}
};
Однако даже с этим, handleRedirects
функция никогда не вызывается, и xmlHttp.status
всегда возвраты 0
. Также не похоже, что cookie становятся отправленными с вызовом cas.mydomain.com. (См. этот вопрос для подобной проблемы.)
Действительно ли это - проблема с вызовами Ajax, не обрабатывающими перенаправления, или там больше продолжается здесь, чем кажется на первый взгляд?
Здесь действительно происходит нечто большее, чем кажется на первый взгляд.
После некоторого исследования выяснилось, что запросы jQuery AJAX, сделанные таким образом, не работают, если они сделаны не к тому же самому поддомену. В данном примере запросы выполняются к cas.mydomain.com
с другого сервера. Даже если он также находится на mydomain.com
, запрос будет неудачным, потому что поддомен не совпадает.
jQuery AJAX действительно правильно обрабатывает перенаправления. Я провел несколько тестов со скриптами на том же поддомене, чтобы убедиться в этом. Кроме того, куки передаются, как и следовало ожидать. См. запись в моем блоге об этом исследовании.
Также следует помнить, что протоколы должны быть одинаковыми. То есть, поскольку cas.mydomain.com
использует HTTPS, страница, с которой вы его вызываете, также должна быть на HTTPS, иначе запрос будет неудачным.