基于timertask的注销给我带来了问题

时间:2011-10-01 22:41:21

标签: java servlets login logout stripes

在这个网站上,我需要一个系统,在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,因此无法调用cancel() task变量。

但是我没有得到它,在实例化登录变量后,它不是null

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

1 个答案:

答案 0 :(得分:1)

为什么不让Web容器为您处理会话超时?如果您在web.xml中放入以下代码,则所有非活动会话将在10分钟后过期:

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