これと似たような質問がありますが、何が起こっているのかについての私の理解と、それを修正するために思いついたアイデアを説明しようと思います。うまくいけば、誰かが私を正しい軌道に乗せることができるでしょう.
シナリオ:私の webapp では、保護された領域で認証されたユーザーがタイムアウトします。次に、戻り値として json を期待して、(jquery を使用して) ajax 呼び出しを実行します。
構成: Web サーバーは tomcat で、web.xml の構成コードは次のとおりです。
<session-config>
<session-timeout>30</session-timeout>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
...
<login-config>
<auth-method>FORM</auth-method>
<realm-name>My Authentication Area</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
私が理解していること:これは、30分間のアイドル状態の後にユーザーの認証を解除し、保護されたURLにアクセスしようとした場合、認証されていないユーザーをlogin.jspにリダイレクトするようにWebサーバーに指示します。
私が期待すること: サーバーは http エラーを返します。ユーザーは login.jsp にリダイレクトされます。
何が起こるか: サーバーは、応答コード 200 の ajax 呼び出しへの応答として login.jsp を返します。jquery は、html を json に解析できないため、parseerror をスローします。ユーザーはページに残され、何も起こらなかったようです。
私が理解していること:セッションがタイムアウトし、URLが保護された領域にあるため、Webサーバーはリクエストをサーブレットに転送しませんでした。サーブレット コードについて心配する必要はありません。
私がすること: jQuery.ajaxError グローバル イベントを使用して、すべての parseerrors をインターセプトします。これにより定型コードが削減されますが、すべてのケースをカバーできるわけではありません。また、何らかの理由で正規の json が壊れた構文で返された場合も受け入れられません。
$(document).ajaxError(function(event, jqxhr, settings, exception){
if (settings.dataType === 'json' && exception.type === 'unexpected_token') {
window.location.href = 'login.jsp';
}
})
私がしたいこと: ajaxに応答するときにTomcatにhttpエラーを送信させ、クライアントでリダイレクトを処理させます。Tomcat が標準の URL リクエストと ajax リクエストの違いを生むことができるかどうかはわかりません。
この問題を解決するための最良のアプローチが何であるかわかりません。助けていただければ幸いです。
レン