1

テーブルの内容を変更するためにJavaEEを使用してWebアプリを作成しました。ユーザー認証には、ユーザーのデータベースクレデンシャルを使用しています。これらの資格情報を使用してJDBC接続を作成しています。

この問題は、2人以上のユーザーが同時にログインし、Connectionオブジェクトが最新のユーザーの資格情報で更新されたときに発生しました。したがって、どのユーザーが変更を加えたとしても、最新のユーザーgtのユーザー名がログファイルに記録されます。これは、セキュリティ上の大きな問題です。

では、変更を行っているユーザーの唯一のユーザー名がログに記録されるように、複数のユーザーに対して複数のConnectionオブジェクトを作成するにはどうすればよいですか。

4

2 に答える 2

1

これは、接続オブジェクトへの参照を静的変数に格納し、Webアプリケーションに1つの接続オブジェクトだけを保持しているように聞こえます。その代わりに、HttpSessionを使用して、ユーザー固有の接続オブジェクトをユーザーのセッションに属性として格納できます。ユーザーが最初にアプリケーションにアクセスするときに接続をそこに保存し、その後の各要求で接続を取り戻し、それがまだ有効かどうかを確認して使用します。

また、セッションがタイムアウトしたら、接続を閉じることを忘れないでください。これは、セッション内の接続をチェックするHttpSessionListenerを実装し、sessionDestroyed()メソッドで閉じることで実現できます。

編集:複数の理由から、通常、ユーザーがアプリケーションにログオンできるようにするためにDBクレデンシャルを使用することは適切な設計ではありません。ただし、セッションの数が少なく(したがって、DBで同時に開かれる接続の数が少ない)、DB権限が適切に設定されている場合でも、これは適切に機能する可能性があります。

編集2:そしてもちろん、そのようなキャッシュされた接続へのアクセスを同期する必要があります(たとえば、ユーザーが複数のブラウザーウィンドウを開いているなど、複数の同時リクエストでアプリをヒットしようとした場合)。これは(少し)トリッキーかもしれません。

于 2012-09-05T17:19:59.003 に答える
1

接続のリストを開いてユーザーに割り当てたままにするのではなく、ユーザー名/パスワードなどをHttpSessionに保存することをお勧めします。数十または数百のユーザーがいると想像してください-RDBMSはそのような数の同時接続を正しく処理しますか?何千人ものユーザーはどうですか?

于 2012-09-05T17:20:27.783 に答える