会话超时和注销时的数据库清理

发布于 2024-10-19 14:39:56 字数 509 浏览 1 评论 0原文

只是一个简单的问题。登录时,我将每个用户放入一个数据库中,因为一次只有一个用户可以使用相同的用户名和密码登录。如果该用户已经在数据库中,我不会让该用户进入。当用户注销时,我会清除 DB 表并使 Servlet 中的会话无效。 现在,如果用户忘记注销,会话显然将在例如过期。 20分钟左右 在 web.xml 中我创建了这个:

<listener>
    <listener-class>com.servlets.dbclean</listener-class>
</listener>

这个 dbclean 类然后实现 HttpSessionListener 并在 sessionDestroyed 方法上清除数据库。 我的问题:仅在此处进行数据库清理是否足够,因为当用户手动注销时,会话将失效并且将调用此方法,或者我应该在 /doLogout Servlet并在用户忘记注销时依赖这个Listener?那么只使用这个Listener是不是一种节省的方式呢?

Just a quick question. On login I put every user into a db because one time only one user can log in with the same username and password. If this user is already in the db I dont let the user in. When the user logs out I clear the dB table and invalidate the session in a Servlet.
Now if the user forgot to logout, the session obviously will be expired at eg. 20 minutes so
In web.xml I created this:

<listener>
    <listener-class>com.servlets.dbclean</listener-class>
</listener>

This dbclean class then implements HttpSessionListener and on the sessionDestroyed method I clear up the db.
My question: is it enough to have this db cleanup happen only here, because when the user logs out manually the session will be invalidated and this method will be called or should I clean up the db at the /doLogout Servlet and rely on this Listener when the user forgot to log out? So is it a save way to use only this Listener?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云之铃。 2024-10-26 14:39:56

当会话失效时,侦听器将被触发 - 通过超时或调用 invalidate()

如果您不需要支持集群,您可以简单地将登录的用户存储在 Set 中 内的 ServletContext (在 sessionCreated(..) 中执行此操作,然后将其从 sessionDestroyed(..) 中的 Set 中删除无需访问数据库 - 它可以全部保留在内存中(使用会话复制也可以在集群中执行此操作)。

The listener will be triggered when the session is invalidated - either by timeout or by calling invalidate()

If you don't need to support clustering, you can simply store the logged user in a Set inside the ServletContext (do it in on sessionCreated(..), and then remove it from that Set in sessionDestroyed(..). No need to go to the database - it can all stay in memory. (Using session replication you can do this in a cluster as well)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文