- PR -

セッションの解放について

1
投稿者投稿内容
Java使い
常連さん
会議室デビュー日: 2006/08/16
投稿数: 22
投稿日時: 2006-08-16 14:46
ゲストと管理者でログインすることができ、管理者でログインすれば、必要に応じて任意のゲストのセッションを切断できるような仕組みを実現したいと思っています。

このように任意のセッションを切断するためにはどのようにすればよいのでしょうか。
任意のゲストのセッションオブジェクト(HttpSession)を得る仕組みがあれば、そのセッションに対してinvalidate()を発行すればよいと思い、HttpSessionContextクラスが利用できるかと思ったのですが、現在は非推奨APIになっています。

良い方法があれば教えていただけないでしょうか。
JDK1.5、JSP、strutsの環境で利用予定です。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-16 15:51
ログインしたら、そのユーザーのIDをアプリケーションスコープセッションと
自身のセッションにでも登録しておいて、アクセスされる度に両方のセッション
上にユーザーIDが登録されていることを確認するようにするというのはどうでし
ょうか。ユーザーをログアウトさせたい場合は、アプリケーションスコープ上の
該当ユーザーIDを削除してしまえば、そのユーザーが次にアクセスしに来た時に
は、自分がログアウト状態ということが判断できますし。同期処理とかを行えば、
アプリケーションスコープのセッションではなくて、普通のJavaのクラス内に
ユーザーIDの情報を持ってもいいですし、多少負荷が上がってもよければDBに
ユーザー情報を乗っけておくという手も使えますよ。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-08-16 16:55
HttpSessionActivationListenerを実装して「生きているセッション」を管理するような処理を作成する、
というのが正統的なアプローチでしょう。
ユーザIDとセッションの関連付けも自前で用意する必要がありますが、特に困難はないと思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-08-16 18:49
引用:

Java使いさんの書き込み (2006-08-16 14:46) より:
ゲストと管理者でログインすることができ、管理者でログインすれば、必要に応じて任意のゲストのセッションを切断できるような仕組みを実現したいと思っています。


直接の回答ではないかもしれませんが、低レベルのセッションをそのセッションの外から直接操作しないほうが良いかもしれません。私は JSP や Struts を良く知らないので、もしかしたら的外れなことを言っているかもしれませんが、一般に、セッションをその外からスーパーバイザー的に操作することはあまりやらないです。
どのみち、ゲストのログイン管理で、ログイン情報をデーターベース(DBMS かオンメモリーかいろいろありますが)に持っているはずなので、管理者がそのデーターベースを操作してゲストのログアウト処理をおこない、ゲストのセッション自身がセッションの破棄をおこなうようにすることになります。小僧さんが書かれたことと同じかもしれませんが。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
Java使い
常連さん
会議室デビュー日: 2006/08/16
投稿数: 22
投稿日時: 2006-08-16 19:55
お返事ありがとうございます。

皆様の話を総合すると、セッションをinvalidate()してセッションを切断するのではなく、ユーザIDを削除するなどしてアプリケーション上からログインしていないように見せるのが一般的のようですね。
この場合、セッションが生きているためリソースは消費すると思いますが、タイムアウトになるまで待って自動的に解放されるのを待つしかないですよね。

セッションをinvalidateしようとすると、ServletContextにセッションそのものを持たせる必要があり(ここ間違ってないですよね?)、それはそれでリソースを消費しそうですしね。

ユーザIDを削除する方向で考えたいと思います。
変なこと言ってるようであれば、指摘いただくと助かります。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-16 23:33
引用:

セッションをinvalidateしようとすると、ServletContextにセッションそのものを持たせる必要があり(ここ間違ってないですよね?)、それはそれでリソースを消費しそうですしね。


いえいえ、ServletContextでは無くてもいいんですよ、DBでもファイルでも何でも
いいんです。ServletContextは必ず使えるので例として挙げただけです。
それほどセッションのリソース消費が気になるようでしたら、こんな手を考えて
みました。
まず、web.xmlでセッションの生存時間を1分に設定します。
ログイン画面で認証OKとなったら、セッションにユーザーIDなど認証済みである
ことが分かるような情報を載せます、ここまではこれまでの説明と同じです。
その後、HttpSessionのsetMaxInactiveIntervalメソッドで、そのセッションの
有効時間を設定してあげます。以降、認証済みのユーザーが接続してきた場合
は、忘れずにsetMaxInactiveIntervalで有効時間を再設定してあげるという
方法です。有効時間の再設定は、認証チェック処理の際に行えば良いと思うので、
Strutsならばリクエストプロセッサ、Actionクラスを継承したクラスのexecute
などで処理を行えばよいと思います。JSP直アクセスもあるならばサーブレット
フィルタなども選択肢になりますね。
認証されなければ1分程度でセッションは無効になると思いますので、いかがで
しょうかね。
自前でセッションデータを管理するのでしたら、HttpSessionListenerを実装
したクラスで処理すると良いと思いますよ。

1

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