質問
ほとんどのリクエストがAJAX経由で送信されるアプリケーションがありますが、一部のリクエストは「通常」経由で送信されます。 HTTPリクエスト。要求が送信され、ユーザーのセッションがタイムアウトした場合、次のJSONが返されます。
{"authentication":"required"}
すべてのAJAXリクエストを送信するJavaScript関数は、ポップアップメッセージを表示し、ユーザーをログインページにリダイレクトすることにより、この応答を処理します。
ただし、AJAX以外のリクエストがこのレスポンスを受信すると、レスポンスはブラウザによって直接処理されるため(つまり、前述のJavaScript関数がバイパスされるため)、ブラウザにJSONが表示されます。明らかにこれは理想的ではなく、この応答を受け取る非AJAXリクエストがAJAXリクエストと同じように動作することを望みます。これを達成するために、2つのオプションを考えることができます:
-
アプリケーションを調べて、すべてのリクエストをAJAXリクエストに変換します。これは動作しますが、長時間かかる可能性があります!
-
上記のJSONは非常に単純なJSPによって生成されます。コンテンツがブラウザに表示される直前に実行されるこのJSPにJavaScriptイベントハンドラを追加することが可能かどうか疑問に思っています-これはAJAXリクエストに対して決して呼び出されないと仮定していますか?このハンドラーは、ポップアップを表示してリダイレクトを実行する他のJavaScriptコードを呼び出すことができます。
(2)で説明したハンドラーを実装する方法を正確に知っている人、または他の潜在的な解決策がある人は、それらを渡してくれれば非常に感謝します。
乾杯、 ドン
解決
そのようにハンドラをJSPに追加することはできません。追加するものはすべて、JSONを生成しないページになります。
次の2つのオプションがあります。 出力を変更する画面にURLパラメーターを追加して、ページにパラメーターを追加します。
URL: http://domain/page.jsp?ajaxRequest = true JSONのみを出力します
URL: http://domain/page.jsp 別のページに転送できるjspページが表示されます。
または
レスポンスを変更して、直接ヒットした場合にWebブラウザによって実行される転送コードをJSPに含めます。次に、呼び出し元のAJAXに転送コードを削除してもらい、残っているものを処理します。
他のヒント
3)AJAXコードを変更して、GETまたはPOSTに変数を追加します: outputJson = 1
4)「Accept」リクエストHTTPヘッダーを確認します。
次に、サーバー側で出力を調整します:
e.g。
if(Accept contains application/json...) { // client asking for json, likely to be XHR
return {"foo":"bar"}
} else { // other
return "Location: /login-please";
}
次のような、よりスマートなエラーメッセージから始めます。
{"error":"authentication required"}
JSON出力をコールバックでラップします:
errorHandler({"error":"authentication required"});
スクリプトでハンドラーを待機させる:
function errorHandler(r) {
alert(r.error);
}
そして、 application / x-json
ではなく、 text / javascript
として送信することを忘れないでください。