S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

ポップアップ・ダイアログでのセッションタイムアウト

普通のsubmitであれば、サーバ側でセッションタイムアウトを検知した時に、セッションタイムアウトのページへ遷移させることができる。
しかし、ポップアップ・ダイアログの操作中のセッションタイムアウトの場合、ブラウザにどのような挙動をさせればよいのか???
ポップアップ・ダイアログでの操作中にセッションタイムアウトとなった場合、ポップアップ・ダイアログの中にセッションタイムアウトのページを描画してしまい、呼び元のウィンドウは、ポップアップ・ダイアログを呼び出した時点のままとなっている。


この場合、
・ポップアップ・ダイアログを閉じる
・呼び元のウィンドウをセッションタイムアウトのページへ遷移させる
という風に、動作させればよいと考え、onclickイベントやonchangeイベントなどで、下記のようなJavaScriptを呼び出してみた。
(isAliveSessionサーブレットは、セッションが有効であれば"OK"、セッションタイムアウトであれば"NG"をレスポンスとして返す)

var contextPath = null;

function action() {

    if (isAliveSession() == false) {
        window.opener.location.href = contextPath + "/sessionTimeout.html"
        window.close();
        return false;
    }

    return true;

}

funtion isAliveSession() {

    var xmlHttpObject = null;

    try {
        xmlHttpObject = new XMLHttpRequest();
    } catch (e) {
        try{
	    xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("unsupported");
            }
        }
    }

    if (xmlHttpObject != null) {
        xmlHttpObject.open("GET", (contextPath + "/servlet/isAliveSession"), false);
        xmlHttpObject.send(null);
    }	

    if ((xmlHttpObject.readyState == 4) && (xmlHttpObject.status == 200)) {
        if (xmlHttpObject.responseText == 'OK') {
            return true;
        }
    }

    return false;

}


ところが、MyFaces 1.2.3/Trinidad 1.2.9では、ポップアップ・ダイアログは開いたままで、想定した動作をしない(tr:commandButtonタグのuseWindow属性を"true"に設定し、ポップアップ・ダイアログを開いている)。
ソースを読む前に、actionメソッドを下記のようなコードで確認すると想定した動作となった(念のため呼び元もopner.topとしておいた)。

function action() {
    if (isAliveSession() == false) {
        window.top.opener.top.location.href = contextPath + "/sessionTimeout.html"
        window.top.close();
    }
    return true;
}


MyFaces/Trinidadのtr:commandButtonタグで、userWindow属性を"true"と設定して開いたポップアップ・ダイアログは、frameを使用しているらしい。