現在servlet,JSPでwebサイトを作っていて(webserver:Apache2.x - Tomcat4.x)、
ユーザーの2重ログイン防止の為に
(1)ユーザーが×(閉じる)ボタンを押した時
(2)セッションタイムアウトになった時
のイベントを拾ってDBへの書き込み処理をしたいのですが、
どのようにやればよいのかわかりません。
((2)の場合SessionListenerというのがあると聞いたのですが、使い方がいまいち分からず・・・)
servletプログラミングで上の2つのイベントの拾い方をご存知の方がいたら教えていただきたいです。
よろしくお願いします。
No.6ベストアンサー
- 回答日時:
すみません。
見落としていました。
No.3 の補足で、
> HttpSessionBindingListenerを実装したクラスでgetAttribute()できました
と記述されていますが、これ自体が問題です。
No.4 で記述したように
> 2.アプリケーションでinvalidate()が呼ばれてセッション自体が消えた
> 3.セッションタイムアウトでセッション自体が消えた
という場合にも、valueUnBound()が呼ばれます。
そして、これらの場合、セッションが無効化されてから valueUnBound()
が呼ばれてしまうので、今問題になっているような状況になります。
これについては、ログオフ処理で利用するHttpSessionの情報を
1つのクラスにまとめ、そのクラスに HttpSessionBindingListener
を実装します。そして、valueUnBound() で自分自身のフィールドに
アクセスして処理を行うようにします。
こうすることで、invalidate() でセッションが無効化されて valueUnBound()
が呼ばれても、valueUnBound() を持つクラスのインスタンス自体は
破壊されていないので、情報が取得できます。
すなわち、
> valueUnBound()の中では
> 1)セッション情報を取り出す
> 2)取り出した値を使ってDBに書き込みする
> 3)セッション情報を破棄する
2) で本来取り出されるクラスにvalueUnBound() を実装して、
そこでDBへの書き込みを行うようにします。
この場合、1) は特に不要(自分自身に情報が存在するから)ですし、
3) はログオフの処理を行っている場所で呼び出すようになります。
「ログオフ処理で利用するHttpSessionの情報を
1つのクラスにまとめ、そのクラスに HttpSessionBindingListener
を実装し」たら、うまく処理できるようになりました。
丁寧な回答でとても分かりやすかったです。
本当に助かりました。ありがとうございました。
No.5
- 回答日時:
> ただ、現在「removeAttribute() メソッドを呼び出している場所(ログオフ処理)で、
> invalidate() メソッドを呼ぶようする」と、
> 1.removeAttribute()でvalueUnBound()が呼ばれ、
> 2.invalidate()でまたvalueUnBound()が呼ばれてしまうらしく、invalidate()で呼ばれた時の
> valueUnBound()はgetAttribute()出来ずにExceptionで落ちてしまいます。
どうも、私の書き方に問題があったような、、、
> removeAttribute() でセッションオブジェクトから特定のオブジェクトを削除してから
> セッションを無効化するのであれば、removeAttribute() メソッドを呼び出している場所で、
> invalidate() メソッドを呼ぶようするだけで構わないのでは?
これは、現在ログオフ処理で行っている、removeAttribute()を
invalidate()に置き換えては?という意味です。
invalidate()を実行すると既存のセッションオブジェクト自体が
削除されるわけですから、わざわざ直前でremoveAttribute()を呼び出す
意味がないように思えますが、どうでしょうか?
この回答への補足
invalidate()に置き換えた場合なのですが、
invalidate()でvalueUnBound()が呼ばれた場合、セッション情報が破棄されているらしく、
getAttribute("xx")で自分で詰めたセッションの情報が取り出せません。
(質問が堂堂巡りのようになってしまいすみません。)
上記valueUnBound()の中では
1)セッション情報を取り出す
2)取り出した値を使ってDBに書き込みする
3)セッション情報を破棄する
という処理をしたいのですが、invalidate()の場合、
3)の要件を先に満たしてしまうために1)の処理ができないようです。
No.4
- 回答日時:
> ちなみにremoveAttribute()でvalueUnBound()を呼び出した時に、
> セッション情報の破棄をしたいのですが、valueUnBound()メソッドの中
> でsession.invalidate()をすると「無効化されたセッションです」と
> いうエラーで落ちてしまいます。
これは、例えば、セッションが削除(HttpSession#invalidate()や
タイムアウト)されたときにvalueUnBound() が呼ばれたせいだと思います。
removeAttribute() でセッションオブジェクトから特定のオブジェクトを削除してから
セッションを無効化するのであれば、removeAttribute() メソッドを呼び出している場所で、
invalidate() メソッドを呼ぶようするだけで構わないのでは?
valueUnBound() メソッドは、
1.アプリケーションでremoveAttribute()が呼ばれてセッションから消された
2.アプリケーションでinvalidate()が呼ばれてセッション自体が消えた
3.セッションタイムアウトでセッション自体が消えた
という全てのパターンで呼ばれてしまいます。
> removeAttribute()したらsession.invalidate()は必要ないのでしょうか?
removeAttribute() はセッションオブジェクトから特定のオブジェクトを削除
するためのメソッドで、HttpSession#invalidate() はセッションオブジェクトを
破棄するメソッドですから、必要です。
ただし、明示的に破棄しなくても、一定時間後タイムアウトでなくなりますが。。。
この回答への補足
的確でわかりやすい回答をありがとうございます。
ただ、現在「removeAttribute() メソッドを呼び出している場所(ログオフ処理)で、
invalidate() メソッドを呼ぶようする」と、
1.removeAttribute()でvalueUnBound()が呼ばれ、
2.invalidate()でまたvalueUnBound()が呼ばれてしまうらしく、invalidate()で呼ばれた時の
valueUnBound()はgetAttribute()出来ずにExceptionで落ちてしまいます。
そして、2.のinvalidate()で呼ばれた時のvalueUnBound()では、セッションオブジェクト自体は残っているらしく(getId()でセッションIDなどは取得できる)、
if(session==null)などでは判定できず、removeAttribute()のvalueUnBound()メソッドが呼ばれたのか、invalidate()のvalueUnBound()が呼ばれたのか判断できずにいます。
このような場合はremoveAttribute()で設定したセッション情報を1つ1つすべて削除していくしかないのでしょうか。
(ちなみにremoveAttribute()のvalueUnBound()の中でもinvalidate()してみましたが、やっぱりダメでした。これは当然ですかね(^_^;))
分かりにくい説明ですみませんが、重ねて教えていただけたらありがたいです。よろしくお願いします。
No.3
- 回答日時:
> String str = (String)se.getSession().getAttribute("xx");
> ができませんでした。(se.getId()とかはできるのに・・・)
> setAttribute()で詰め込んだ値を取り出す方法はないものでしょうか・・・。
これは、HttpSessionBindingListenerインタフェースを使います。
というのは、HttpSessionListener#sessionDestroyed() は、
「セッションが削除された」ときに呼ばれるため、セッションの情報には
アクセスできません。
この代わりに、
public MyBindingClass implements HttpSessionBindingListener {
private String foo;
public void valueBound(HttpSessionEvent se) {
}
public void valueUnBound(HttpSessionEvent se) {
// セッションからこのクラスが削除されるときに
// 実行される。foo に合わせて処理したり、、、
}
}
というクラスを作成して、これをSessionにsetAttribute()してやります。
この回答への補足
HttpSessionBindingListenerを実装したクラスでgetAttribute()できました!!ありがとうございます。
ちなみにremoveAttribute()でvalueUnBound()を呼び出した時に、セッション情報の破棄をしたいのですが、valueUnBound()メソッドの中でsession.invalidate()をすると「無効化されたセッションです」というエラーで落ちてしまいます。
removeAttribute()したらsession.invalidate()は必要ないのでしょうか?
稚拙な質問で申し訳ないのですが、教えていただけるとありがたいです。よろしくお願いします。
No.2
- 回答日時:
こんにちは
>ユーザーの2重ログイン防止の為に
これはよくやることなので大手のソフト開発の
現場では定石となっている場合が多いです。
>(1)ユーザーが×(閉じる)ボタンを押した時
これは残念ながら拾うことができません。
>(2)セッションタイムアウトになった時
1.HttpSessionBindingListenerという
リスナーを設定することによって
たとえば30分通信が無かったら接続をきるなどの
処理ができます。
(使い方はHttpSessionの中で通常の
リスナーのようにaddListenerすればよかったと思います)
たしか原田洋子さんの本に載っていたと思うのですが・・・
2.web-xmlの中でも指定できるみたいです。
これはやってみたこと無いのでちょっとわからないですが・・・
参考URL:http://java-house.jp/ml/archive/j-h-b/030594.html
この回答への補足
HttpSessionBindingListenerの方はまだよくわからなくて試していません・・・。
ただ、HttpSessionListenerはgetAttribute()で値がとれなかったので、こちらの方法を頑張って試してみます。
ちなみに
HttpSessionBindingListener
と
HttpSessionListener
はどう違うのでしょうか?
No.1
- 回答日時:
(1) についてはServlet、JSPでは不可能です。
これはクライアント側の話なので、VBScriptとかであれば
実現可能です。
その場合は、IE限定になりますが。。。
(2) については、Servlet2.3以上をサポートするコンテナ上で
HttpSessionListenerインタフェースを実装したクラスを用意して
web.xml に設定を記述すれば実現できます。
public MyListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
// ここにセッションが作られたときの処理
}
public void sessionDestroyed(HttpSessionEvent se) {
// ここにセッションが削除されるときの処理
}
}
-- web.xml --
<listener>
<listener-class>MyListener</listener-class>
</listener>
-------------
この回答への補足
HttpSessionListenerを実装したクラスを作って、やってみました。
(1)の×ボタンのイベントを拾うのやっぱり無理みたいですね。
(2)についてはこの方法だと、
String str = (String)se.getSession().getAttribute("xx");
ができませんでした。(se.getId()とかはできるのに・・・)
setAttribute()で詰め込んだ値を取り出す方法はないものでしょうか・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
好きな「お肉」は?
牛肉、豚肉、鶏肉、ラム肉、クマやシカの狩猟肉……。 いろ〜んな肉が食べられるようになりましたよね。 あなたがこれまで食べて「これはうまい!」とか「なんじゃこりゃ!」と好きになったお肉を教えてください。
-
ブラウザを閉じたときにログアウト処理を実行するには
その他(コンピューター・テクノロジー)
-
ブラウザの×ボタン(閉じるボタン)押下時のイベントをひろいたい
JavaScript
-
JavaScriptで ブラウザの閉じるを無効化に
JavaScript
-
-
4
JSP+Servletで終了ボタン
Java
-
5
Webブラウザの閉じるボタン無効化についての質問
JavaScript
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コネクション・セッション・ト...
-
別ブラウザにセッションを渡す...
-
フォームデータをlocation.repl...
-
DVD-Rの「セッションを閉じる」...
-
コンピュータへの接続数が最大...
-
ディスクのセッションを閉じる...
-
ブラウザを閉じずにセッション...
-
DVDの中身が表示されません。
-
セッションIDを取得したい
-
ルータのPPPのランプの色が変
-
HTMLボタンの文字色を変え...
-
Accessの画面更新を一時的に停...
-
同じソリューション内の別のプ...
-
asp.NET初心者です。「 ’Contex...
-
Javascriptでページ内容全体を...
-
メール添付されたPDFファイルが...
-
Eclipseでクリーンが出来ない
-
SuspendLayoutが効かない?
-
複数選択のListBoxでClickイベ...
-
formの送信ボタンをテキストに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コネクション・セッション・ト...
-
DVD-Rの「セッションを閉じる」...
-
コンピュータへの接続数が最大...
-
ブラウザを閉じずにセッション...
-
DVDの中身が表示されません。
-
フォームデータをlocation.repl...
-
会社への勤怠届出にGoogleフォ...
-
セッションIDを取得したい
-
ブラウザの×(閉じる)ボタンの...
-
SESSIDってなんですか?
-
別ブラウザにセッションを渡す...
-
ASP.net MVC セッションハイジ...
-
ルータのPPPのランプの色が変
-
助けて下さい!!セッション変...
-
ASP.NET 電卓計算
-
セッション変数の破棄と再設定
-
WebBrowserを初期化
-
セッションIDについて
-
ASPで別ページにPOSTで送信した...
-
&文字の変更
おすすめ情報