普通の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を使用しているらしい。