只要没有会话,我的应用程序就会将用户重定向到登录页面。但是对于 Ajax 请求,这种重定向不会发生。
我需要为应用程序中的所有 ajax 调用处理这个重定向问题。
只要没有会话,我的应用程序就会将用户重定向到登录页面。但是对于 Ajax 请求,这种重定向不会发生。
我需要为应用程序中的所有 ajax 调用处理这个重定向问题。
我在 Zend/PHP 项目上做了类似的事情。不幸的是,我不熟悉 Java,我只能建议基本方向。
默认情况下,XMLHttpRequest 执行重定向。因此,如果您在 ajax 请求期间执行重定向,XMLHttpRequest 将执行它,而不会让您知道重定向发生了。至少我没有办法捕捉到这种情况并以某种方式处理它。因此,在服务器端,我覆盖了重定向方法。假设你也可以在 Java 中做类似的事情。一旦请求来自 ajax(您可以在 ajax 请求中添加一些特定的标头并在服务器上检查它),您可以返回与标头不同的Location
标头。例如,New-Location
, 并没有实际的重定向。只需停止请求执行。
在客户端,您可以使用jQuery.ajaxSetup一次性为所有 ajax 请求配置全局处理程序。以下是如何向所有请求添加标头.ajaxSetup
:
$.ajaxSetup({
headers: {
XHTTPRequest: 'true'
}
});
此外,您可以设置全局ajaxSuccess和ajaxError处理程序。它们将在单独的 ajax 请求的任何成功/错误处理程序之前执行。在全局 ajax 成功中,您可以从xhr
作为第三个参数传递给回调函数的对象中获取标头并执行重定向:
var newLocation = xhr.getResponseHeader("New-Location");
if(newLocation)
document.location = newLocation;
基本上,您可以返回特殊对象而不是标头,或者找到其他方法将新位置传递给您的ajaxSuccess
回调。
我这样做的方式:
在服务器端:
define('BASE_URL','http://www.yourdomain.com');
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
// if it's an ajax request
$json['success'] = 1;
$json['redirect'] = BASE_URL.'/logout';
echo json_encode($json);
}else{
// if it's an non ajax request
}
在客户端使用 jquery:
$.ajax({
type: "POST",
url: 'www.yourdomain.com',
data: {test: 1},
complete: function(e, xhr, settings){
switch(e.status){
case 500:
alert('500 internal server error!');
break;
case 404:
alert('404 Page not found!');
break;
case 401:
alert('401 unauthorized access');
break;
}
}
}).done(function( data ) {
var obj = jQuery.parseJSON(data)
if (obj.success == 1){
var url = obj.redirect;
location.href = url;
}
});
您可以在 AJAX 成功块中使用window.location将用户重定向到目标页面。