- PR -

サイトを去った時のオートログアウト

1
投稿者投稿内容
mandm
常連さん
会議室デビュー日: 2005/06/04
投稿数: 30
お住まい・勤務地: ニューヨーク
投稿日時: 2006-01-27 06:09
こんにちは

現在あるWebアプリをtomcat5.5 上で作成中です。
そこには、ログイン、ログアウトの機能があります。

で ログアウトのタイミングを、

1.ログアウトメニューを押下したとき
2.webアプリのコンテキストパスと違うサイトへ 移動したとき。
3.ブラウザー画面を閉じたとき

にしたいのですが どうやって実装したらいいでしょうか?
ログアウトの処理はサーブレットで、やっており
ログアウト時間のDBへの登録と session invalidateをやってます。

多分 body の onUnloadから javascripでなんとかできるかもしれないと
考えているのですが、良いアイデアが浮かびません。

サーバーサイドでもクライアントサイド でもよいので 良い実装方法は
ありませんんでしょうか?

よろしくお願いいたします。



NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2006-01-27 09:39
1.ができているなら
2.と3.はOnUnloadで別画面でログアウト画面を呼びだし
ログアウト画面の応答としてwindow.close()を戻すような実装で
不完全ながらできます。

不完全というのはタスクバー等から消されるとOnUnloadが動かないためです・・・
その為にサーバー側ではセッションのタイムアウトのタイミングでログアウト処理を流す必要もあります。

完全に判断することはできないので私がやったときは×ボタンは押さないでログアウトボタンでログアウトしてくださいという運用とセッションタイムアウトで逃げました。


かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-01-27 12:30
ログアウトの厳密性にこだわる理由はあるのでしょうか。
結果から言うと、NYRLさんの仰るとおり完全なものは無理でしょう。
JavaScriptも確実に使えるというわけではありませんし。

2.に関しては、
例えば、自サイトからヤフーなどに遷移したとき等は
判断できるはずないですよね。

遷移前のonunloadと遷移後のonloadの時間の差で
判断できないわけではありませんが、
実行時の負荷や開発の手間を考えると、
そこまでするメリットはないと思います。

mandm
常連さん
会議室デビュー日: 2005/06/04
投稿数: 30
お住まい・勤務地: ニューヨーク
投稿日時: 2006-01-27 23:41
NYRLさん、かつのりさん
返信有難う御座います。それほど 完全でなくても大丈夫なのです。90%の成功率くらいであれば。

NYRLさん>不完全というのはタスクバー等から消されるとOnUnloadが動かないためです・・・

というのは、 onUnloadで別画面を出した瞬間に、ユーザーが そのログアウト用の
画面を 閉じちゃったら ログアウトできないということでしょうか?タスクバーからというところが 自分の理解が正しいか自信がないのです、すみません。

もし その理解(OnUnloadで別のPOPUP画面とかをだして その画面を ログアウトサーブレットに飛ばし、直後 window.close())という意味でしたら、それは 私も考えたのです。無理やりその画面 を 閉じられるくらいであれば 許されます。 が、1つ問題があります。

それは、 かつのりさんが おっしゃっていることだとおもうんですが、
次にいくURL(たとえば、IEのホームページボタンとか、履歴URLをおしたときのURL)の 取得が javscript上で 取れるかどうかなのです。同じWEBアプリ上で 画面遷移したときにも Onunloadが起きてしまうため(全画面ともFrameSetは使用してない)同じアプリ内での遷移なのか、他のサイトへの遷移なのかが、区別できないんです。まさに

かつのりさん>例えば、自サイトからヤフーなどに遷移したとき等は 判断できるはずないですよね。

OnunloadのJavascrript関数の中で なにかのJavascriptのオブジェクトから
次に飛ぶ URLがとれれば、 Webアプリ内部かどうか判断でき、 分岐ができるのですが。
そういう情報が入った オブジェクトはなさそうですね。

それで 1つ考えているのは、 Framesetを使って 隠し フレームを常に、おいておき
その Onunloadで、いけるかどうかを 実験中です。また進展あったら 投稿します。

[ メッセージ編集済み 編集者: mandm 編集日時 2006-01-28 00:25 ]
NYRL
ベテラン
会議室デビュー日: 2003/07/14
投稿数: 90
投稿日時: 2006-01-30 13:25
画面の消し方によってはonUnload自体がおきないことがある(タスクマネージャーからの削除)のですがそれでよいなら

やった方法はまずログイン画面を用意します。
ログイン画面は一応URL等の出ないのにしましたがそこは重要ではなく

この画面は100%のフレームを設定しその中にonunload()を書きます。
業務内の遷移はこのフレーム内に表示する形にします。
こんな感じ(最近書いてないので動かないかも)です
<frameset rows="100%" OnUnload="終了処理">
<frame src="業務.html" name="gyoummu">
</frameset>

これであればOnUnloadが稼動するのはフレームがURL移動されたときだけですので業務とそれ以外の判断はできます。
mandm
常連さん
会議室デビュー日: 2005/06/04
投稿数: 30
お住まい・勤務地: ニューヨーク
投稿日時: 2006-01-31 01:25
有難う御座います。そんな方法もありなんですね。
私の方は、同様にFramesetなのですが、0%と100%の2つのFrameを用意して
うまくいきました。ちょっとだけコードを載せときます。POPUPを出しでそこで
ログアウトしてます。ちょっと効率は悪い気がしますが これから洗練します。

ログイン直後の画面を以下にします。(ログイン画面でもいいか)
<frameset rows="0%,100%" border="0" frameSpacing="0" frameBorder="0">
<frame name="autologout" src="autologout.html" scrolling="no" noresize="noresize"/>
<frame name="main" src="業務.do"/>
</frameset>

autologout.htmlでは、別サイトにいかれたときに 小さいウインドウひらきます。
<body onUnload="window.open('logout.html','wind1','width=200,height=5');">

logout.htmlでは、ログアウトサーブレットにアクセスしつつ、画面とじます。
killFunction()は、保険です。

<html>
<SCRIPT language="JavaScript">
<!--
function closeThisWin(){
window.close();
}
function killFunction(){
//dummy function
}
-->
</SCRIPT>
 <body onLoad="closeThisWin();" onUnload="killFunction();">
AUTO LOGOUT Processing......
<IMG src="あなたのlogout.do" width=1 height=1 >
</body>
</html>
1

スキルアップ/キャリアアップ(JOB@IT)