2009-04-13 10 views
4

私のJava EEアプリケーションでは、セッションに問題があります。さまざまなユーザーがアプリケーションにログインし、指定されたユーザーは彼が許可されているデータを見ることができます。彼は他のユーザーデータを見ることができません。ユーザーを区別するために、Client_IDを使用しています。すぐに我々ユーザーがログインには、データベースからこのClient_IDを取得し、このようにセッションで設定されているとおりJava EEでセッションを管理するにはどうすればよいですか?

session.setAttribute("Client_ID",user.getClient_ID()) 

は、私たちは、アプリケーション全体でこのセッションの値にアクセスし、そのClient_IDに関連するデータをフェッチします。これは、ユーザーが1つのブラウザで作業する場合には問題ありませんが、問題は次のとおりです。

SuperAdminがあり、その下にすべてのクライアントを表示する必要があるとします。 SuperAdminはclient_1としてログインし、再びclient_2としてログインします。 SuperAdminは、同じブラウザを使用して両方の時間にログインしています。 client_1ブラウザをリフレッシュすると、client_2の詳細が表示されますが、これは発生しません。

私たちのアプリケーションは、同じブラウザで2つの異なるログインに対して同じセッションを使用していると思います。この問題の解決策は何でしょうか?ページを更新するときに、特定のクライアントの正しいデータが表示されるはずです。

答えて

7

セッションIDの保存にCookieを使用しないで、代わりにリクエストパラメータを使用します。 開いているタブはそれぞれ、自分のセッションを要求します。クッキーを使用すると、ブラウザのすべてのタブに1つのクッキーしかありません。

P.S.: 同じブラウザで2人以上のユーザーが同時にログインするのは間違いだと思います。アプリケーションは、すでにログアウトするまで、client_1がそれに署名したことを検出して、同じブラウザから他のユーザーのログインを回復する必要があります。たとえば、Googleのアプリケーションはこのように動作します。 SuperAdminにログインせずにclient_1またはclient_2のデータを表示する機能があれば、これは素晴らしいことです。これにより、パスワードを数十回記憶することがなくなり、仕事のパフォーマンスが向上します(時間は金銭的ではありません)。

+0

まさにそうだと思います。 –

1

同じブラウザインスタンス内の複数のタブに異なるものを見たい場合は、セッション管理を再加工し、URLの中からキーを削除する必要があります。

セッションはブラウザタブ間で共有されます(ほとんどのブラウザで共通)ので、1つのタブでログインすると他のタブのセッションに影響します。

1

解決策は、複数のログインの代わりに役割を使用することです。 client_1 SuperAdminロールを与え、クライアント2は与えません。これにより、2度ログインする必要がなくなります。

いずれの場合でも、一度に1人のユーザーしかログインできないようにする必要があります。ログインのプロセスは、前のセッションを無効にする必要があります。私はJava EEで正確なコードを忘れていますが、それはsession.invalidate()のようなものです。

関連する問題