我有一个HTML页面需要使用jQuery AJAX函数向受CAS保护的(
Central Authentication Service)Web服务发出请求.我有以下代码:
$.ajax({ type: "GET",url: request,dataType: "json",complete: function(xmlHttp) { console.log(xmlHttp); alert(xmlHttp.status); },success: handleRedirects });
请求变量可以是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.它看起来也不像是通过cas.mydomain.com调用发送cookie. (有关类似问题,请参阅this question.)
解决方法
确实有更多的事情发生,而不是满足于眼睛.
经过一番调查后,如果不是同一个子域,那么以这种方式生成的jQuery AJAX请求似乎会失败.在此示例中,正在从其他服务器向cas.mydomain.com发出请求.即使它也在mydomain.com上,请求也会失败,因为子域不匹配.
jQuery AJAX确实正确处理重定向.我在同一个子域上使用脚本进行了一些测试来验证.此外,cookie也会按照您的预期传递.本研究见my blog post.
还要记住,协议必须相同.也就是说,由于cas.mydomain.com使用HTTPS,因此您调用它的页面也必须使用HTTPS,否则请求将失败.