我使用 Java EE 编写了一个 Web 应用程序来更改表的内容。对于用户身份验证,我使用用户的数据库凭据。我正在使用这些凭据创建 JDBC 连接。
当两个或多个用户同时登录并且使用最新用户的凭据更新 Connection 对象时,就会出现问题。因此,无论是哪个用户进行了更改,最新用户 gt 的用户名都会登录到日志文件中,这是一个巨大的安全问题。
那么如何为多个用户创建多个 Connection 对象,以便进行修改的用户的唯一用户名出现在日志中。
我使用 Java EE 编写了一个 Web 应用程序来更改表的内容。对于用户身份验证,我使用用户的数据库凭据。我正在使用这些凭据创建 JDBC 连接。
当两个或多个用户同时登录并且使用最新用户的凭据更新 Connection 对象时,就会出现问题。因此,无论是哪个用户进行了更改,最新用户 gt 的用户名都会登录到日志文件中,这是一个巨大的安全问题。
那么如何为多个用户创建多个 Connection 对象,以便进行修改的用户的唯一用户名出现在日志中。
这听起来好像您将连接对象的引用存储在一个静态变量中,而在您的 Web 应用程序中只保留一个连接对象。取而代之的是,您可以使用HttpSession将用户特定的连接对象作为属性存储在用户的会话中。在用户第一次访问应用程序时将连接存储在那里,然后在每个后续请求中,取回连接,检查它是否仍然有效并使用它。
也不要忘记在会话超时后关闭连接。这可以通过实现一个HttpSessionListener来实现,该 HttpSessionListener检查会话中的任何连接并在sessionDestroyed()
方法中关闭它。
编辑:出于多种原因,使用数据库凭据让用户登录应用程序通常不是一个好的设计。但是,如果会话数量较少(因此在 DB 上同时打开的连接数量较少)并且合理设置了 DB 权限,这仍然可以正常工作。
编辑2:当然,对这种缓存连接的访问需要同步(例如,如果用户试图通过多个同时请求来访问您的应用程序,例如通过打开多个浏览器窗口)。这可能有点(有点)棘手。
您可能希望将用户名/密码/等存储在HttpSession中,而不是保留打开并分配给用户的连接列表。想象一下,会有数十或数百个用户——RDBMS 会正确处理如此多的并发连接吗?成千上万的用户呢?