Javaでの解決(extjsまたはjquery)sessionの期限切れのログオン終了の問題


2つの場合のユーザアクセスタイムアウトを解決する:a)通常httpリクエストのセッションタイムアウト;b)非同期httpリクエストのセッションがタイムアウトし、extjsを使用するとほとんどのインタフェースリフレッシュが非同期ajaxリクエストである場合.そのタイプのhttpリクエストは、常にフィルタによってキャプチャされます.分類:通常httpリクエストのheaderパラメータにはx-requested-with:XMLhttpRequestヘッダ情報はなく、非同期であります.実はよくあるajaxフレームワークでは、ヘッダーには自分の身分を示すヘッダー情報もあります.通常のhttpリクエストでは、セッションがタイムアウトしたことを発見した後、直接タイムアウトページにリダイレクトし、アクセスタイムアウトを表示します.非同期httpリクエストの場合、セッションがタイムアウトしたことを発見すると、リクエストのresponseに特定のタイムアウトヘッダ情報を書き込み、クライアントajaxオブジェクトはヘッダ情報を検出し、タイムアウト状態フラグがあることを発見した後、タイムアウト情報を表示するjavascriptメソッドを呼び出し、ユーザーにタイムアウトへのアクセスを促す.
サーバ側セッションがタイムアウトした後、responseに新しいヘッダ情報をフィルタに追加し、リクエストのタイムアウトをマークします.
if(r.getHeader("x-requested-with")!=null && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
    response.setHeader("sessionstatus","timeout");
}
Ext.Ajaxtオブジェクトを使用して非同期要求のインタラクションを完了します.Ext.Ajaxは単一インスタンスオブジェクトです(非常に重要です.グローバル単一Ext.Ajaxインスタンス!).
Ext.Ajaxのrequestcompleteイベントを登録し、各ajaxリクエストが成功した後、まずイベントを開始します.このイベントのコールバック関数で判断
アクセスリクエストがタイムアウトしたかどうか.Ext.Ajaxオブジェクトを使用する利点は、数行のタイムアウト処理コードを含むjsファイルを1つ導入するだけで済むことです.
現在のアプリケーションにタイムアウト処理機能を追加するには、既存のコードを変更する必要はありません.
Ext.Ajaxtオブジェクトを使用して非同期要求インタラクションを完了します.checkUserSessionStatusがコールバックメソッドである場合、各ページ参照:
Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
function checkUserSessionStatus(conn,response,options){
    //Ext     response  
    if(typeof response.getResponseHeader.sessionstatus != 'undefined'){
        //      ,      ...
    }
}
で利用できるいくつかの機能:
a)すべてのajax要求はx-requested-with:XMLhttpRequestヘッダ情報を持つ
b)Ext.Ajaxは単一インスタンスオブジェクトである(非常に重要であり、グローバル単一Ext.Ajaxインスタンス!)
c)Ext.Ajaxのrequestcompleteイベントを登録し、各ajaxリクエストが成功した後、まずイベント(概念はspringのaopブロックに似ている)を鳴らす.
jqueryは、ajaxリクエストが開始されるとajaxStart()メソッドのコールバック関数がトリガーされるなど、sessionの期限切れリクエストを処理するためにいくつかのグローバルイベントを提供する.ajaxリクエストが終了すると、ajaxStop()メソッドのコールバック関数がトリガーされます.これらのメソッドはグローバルなメソッドであるため、作成されたコードがどこにあるかにかかわらずajaxリクエストが発生するとトリガーされます.同様のイベントとしては,ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()などがある.
$(document).ajaxComplete(function(event,xhr,settings){
    if(xhr.responseText=="timeout"){
    	top.location.href='index.php';
    }
});

ajaxリクエストをグローバルメソッドの影響を受けないようにする場合は、$.ajax()メソッドを使用するときに、パラメータのglobalをfalseに設定できます.jqueryコードは次のとおりです.
$.ajax({
    url:"test.html",
    global:false//     ajax  

})

他のajaxフレームワークでは,ユーザアクセス要求のタイムアウトを解決する考え方は類似している.
ここでは実用的なJs方法をお勧めします.
function getRootWin(){
    var win = window;
    while (win != win.parent){
        win = win.parent;
    }
    return win;
}

この方法により、親iframeのメソッドを任意の深さのiframeで呼び出すことができる.具体的には、どのiframeのユーザアクセス要求がタイムアウトしても、この方法によって最外層iframeの終了方法を呼び出すことができ、これにより、ユーザに統一的なアクセスタイムアウト終了UIレンダリングを提供することができる.