私のアプリケーションは、セッションがないときはいつでもユーザーをログイン ページにリダイレクトします。しかし、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
、3 番目のパラメーターとして渡されたオブジェクトからヘッダーをコールバック関数に取得し、リダイレクトを実行できます。
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を使用して、ユーザーをターゲット ページにリダイレクトできます。