基于时间任务的注销给我带来了问题



在这个网站,我需要一个系统,登录用户出10分钟后。为了登录,我使用了一个简单的过程,插入一个用户(在我的例子中称为Lid)实例,注销将使会话无效,另外,当用户在计时器启动时登录一个定时器任务,并在10分钟后使会话无效。

代码如下:

MyTask task = null;
private void setCurrent(String key, Object o) {
    getRequest().getSession().setAttribute(key, o);
}
private <T> T getCurrent(String key) {
    T value = (T) getRequest().getSession().getAttribute(key);
    return value;
}
public void logIn(Lid lid) {
    setCurrent("lid", lid); 
    Timer timer = new Timer();
    task = new MyTask(getRequest().getSession());
    System.out.println(task.toString());
    timer.schedule(task,10*60*1000);
}
public void logOut() {
    task.cancel();
    getRequest().getSession().invalidate();
}

这是MyTask代码:

public class MyTask extends TimerTask {
    HttpSession session = null;
    public MyTask(HttpSession session) {
        this.session=session;
    }
    @Override
    public void run() {
        session.invalidate();
    }
}

问题是,当我自愿退出时,它抛出一个异常,因为它说task变量是null,因此它不可能在task变量上调用cancel()

但是我不明白,在登录变量实例化后,它不是null

你对此有什么建议吗?谢谢你

为什么不让web容器为您处理会话超时呢?如果在web.xml中输入以下代码,所有未激活的会话将在10分钟内过期:

<session-config> 
  <session-timeout>10</session-timeout> 
</session-config> 

最新更新