Webアプリケーションを作っていて、何かとお世話になるのがタイムアウト処理。サーバ側でセッション情報から判断してタイムアウトさせたりするのは簡単ですが、もしJavaScriptがサーバ側に値を取りに行ったら・・・。
今作っているシステムでその状況になると、サーバ側ではタイムアウト処理ができず、しかも取りに行った値の情報はなくなっているので、画面にはExceptionエラー画面が表示されてしまいました。これはマズイ。
ということで、JavaScriptでタイムアウトを検知できないか試行錯誤した結果、何とか問題なく動くようになったので備忘録としてメモメモ。
まず、フォーム側にゲッターさんを用意。このゲッターさんがタイムアウト時間とタイムアウト用ページのURLを渡すようにします。こうすることで、サーバ側のタイムアウト時間と合わせることができるのと、システムプロパティでタイムアウト用ページを切り替えられるから。
例:MainPageForm.java
public int getTimeoutMilliSec() {
HttpServletRequest req = Utility.getRequest();
HttpSession ses = req.getSession();
return ses.getMaxInactiveInterval() * 1000;
}
public String getTimeoutUrl() {
return this.timeoutUrl;
}
次に、JavaScriptでタイムアウト用の関数を作成。
例:mainpage.jsp
var timeoutSec = "<h:outputText value="#{formMainpage.timeoutMilliSec}" />";
var timeoutURL = "<h:outputText value="#{formMainpage.timeoutUrl}" />";
var accessTime = new Date();
function chkTimeout() {
var diff = new Date() - accessTime;
if (diff > timeoutSec) {
location.href = timeoutURL;
return (true);
}
return (false);
}
で、後はonClickイベントでこの関数を呼ぶか、各関数の一番最初にこのタイムアウト用関数を呼んで、戻り値がfalseのときだけ処理をするようにしてあげて、タイムアウト処理ができるようになりました。
もっと楽な方法とか、もっとイイ方法があるかもしれませんが、とりあえずこれでもできました、ということで。
タイムアウト時間やURLをJSPにべた書きしてもいいなら、フォームにゲッターさんを用意する必要もなく、もっとシンプルになります。
コメント