5

我正在使用 servlet 构建一个 java web 棋盘游戏。我需要知道用户何时没有回答 30 秒,我正在使用

session.setMaxInactiveInterval(30);

但是一旦时间结束,我需要在服务器端知道,这样我才能完全制作这个播放器。

就像现在一样,一旦玩家返回并尝试做某事,他将获得超时,我可以在服务器上看到。

一旦会话超时,我如何在 servlet 中知道?!

谢谢你。

4

3 回答 3

18

您需要实现HttpSessionListener接口。它在创建或销毁会话时接收通知事件。特别是,它的方法sessionDestroyed(HttpSessionEvent se)在会话被销毁时被调用,这发生在超时时间结束/会话无效之后。您可以通过调用获取存储在会话中的信息,HttpSessionEvent#getSession()然后对会话进行任何必要的安排。此外,请务必在以下位置注册您的会话侦听器web.xml

<listener>
    <listener-class>FQN of your sessin listener implementation</listener-class>
</listener>

如果您最终想区分失效和会话超时,您可以在侦听器中使用以下行:

long now = new java.util.Date().getTime();
boolean timeout = (now - session.getLastAccessedTime()) >= ((long)session.getMaxInactiveInterval() * 1000L);
于 2013-03-05T12:44:08.497 回答
1

我最终使用了 HttpSessionListener 并以大于 setMaxInactiveInterval 的间隔刷新。

因此,如果在 40 秒后的下一次刷新中,使用的 30 秒没有做任何事情,我将进入 sessionDestroyed()。

同样重要的是,您需要创建新的 ServletContext 才能访问 ServletContext。

ServletContext servletContext=se.getSession().getServletContext();

谢谢!

于 2013-03-05T14:24:24.283 回答
1

根据空闲时间间隔猜测的另一种方法是在用户触发注销时在会话中设置一个属性。例如,如果您可以在处理用户触发的注销的方法中添加如下内容:

httpServletRequest.getSession().setAttribute("logout", true);
// invalidate the principal
httpServletRequest.logout();
// invalidate the session
httpServletRequest.getSession().invalidate();

那么您可以在 HttpSessionListener 类中包含以下内容:

@Override
public void sessionDestroyed(HttpSessionEvent event) {
    HttpSession session = event.getSession();
    if (session.getAttribute("logout") == null) {
        // it's a timeout
    }
}
于 2016-06-09T20:03:05.310 回答