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