2011-01-04 5 views
1

ログインにuserNameとパスワードを使用するWebベースのアプリケーションがあります。どのようにすべてのユーザーが自分のアプリケーションにログインしているか確認することができます

今、すべてのユーザーがその時点でログインしている特定の時刻を確認するにはどうすればよいですか。 私はセッション管理を使用しており、アプリケーション内でDBは使用されていません。ファイルシステム上にあるものはすべて

編集:1つの愚かな疑問..アプリケーションスコープで変数を定義する方法。

<env-entry> 
<env-entry-name>test/MyEnv2</env-entry-name> 
<env-entry-type>java.lang.Boolean</env-entry-type> 
<env-entry-value>true</env-entry-value> 
</env-entry> 

答えて

3

ログイン追跡できるだけですべてがアプリケーションスコープでSetにログインユーザー集めます。アプリケーションがうまく設計されている場合は、ログインしたユーザーを表すjavabean Userが必要です。 HttpSessionBindingListenerを実装して、セッションでバインド/アンバインドしようとしているときにSetからユーザーを追加/削除します。

キックオフ例:あなたはそれが上記の方法でnullを返さないように、アプリケーションスコープにSetを準備する必要があり

public class User implements HttpSessionBindingListener { 

    @Override 
    public void valueBound(HttpSessionBindingEvent event) { 
     Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins"); 
     logins.add(this); 
    } 

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
     Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins"); 
     logins.remove(this); 
    } 

    // @Override equals() and hashCode() as well! 

} 

注意。 nullcheck、またはServletContextListener#contextInitialized()の助けを借りて、同じ方法でこれを行うことができます。

Set<User> logins = (Set<User>) getServletContext().getAttribute("logins"); 
+0

ユーザクラスがセッションリスナークラスとして動作することをどこかに通知する必要がありますか? – Varun

+0

いいえ、あなたはセッション中にそれを置く/取り除くだけです。 'HttpSessionBindingListener'を実装しているものを置いたり削除したりするたびにservletcontainerは自動的に動作します。 – BalusC

2

更新

BalusC's approchがより適している、ここではこのアプローチによって、あなたはセッションのないユーザでログインしていませんを取得しません。これを行うには、HttpSessionBindingListenerを追跡する必要があります。

あなたはHttpSessionListenerを実装することができますし、ユーザー

public void sessionCreated(HttpSessionEvent se) { 
    // adding logging in user to some application data map or inserting it to DB 
} 

public void sessionDestroyed(HttpSessionEvent se) { 
    // remove logged in user to some application data map or inserting it to DB 
} 
+0

そのユーザーからセッションタイムアウトが発生した場合、または彼はもうアクティブではありませんか? – Varun

+0

check update ... –

+0

もう1つ愚かな疑念..このアプリケーションのデータマップは何ですか? – Varun

1

をよりスケーラブルなソリューションをに次のようになります。

その後、どこでもあなたがServletContextへのアクセスをしたアプリケーションでは、サーブレットのように、あなただけの、次のようにログインしているユーザーがアクセスすることができますデータベース内のusersテーブルに "loggedIn"のような列を追加し、ユーザーをログインするとtrueに設定します。これにより、アプリケーションサーバーから膨らみ、アプリケーションが複数のボックスを実行する必要がある場合は分散環境もサポートされます将来は。

関連する問題