会话超时和注销时的数据库清理
只是一个简单的问题。登录时,我将每个用户放入一个数据库中,因为一次只有一个用户可以使用相同的用户名和密码登录。如果该用户已经在数据库中,我不会让该用户进入。当用户注销时,我会清除 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当会话失效时,侦听器将被触发 - 通过超时或调用
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 theServletContext
(do it in onsessionCreated(..)
, and then remove it from that Set insessionDestroyed(..)
. 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)