在这个网站,我需要一个系统,登录用户出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>