【发布时间】:2011-11-29 05:17:40
【问题描述】:
在这个网站上,我需要一个在 10 分钟后将用户注销的系统。
为了登录,我使用插入用户(在我的情况下称为Lid)实例的简单过程,并且注销使会话无效,此外,当用户在计时器内登录 timertask 时,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。
您对此有什么建议吗? 谢谢你
【问题讨论】:
-
是否同时调用注销方法:注销时和计时器结束时?我不清楚代码的流程和用户执行的操作。
-
是的,有一个链接“注销”调用上述注销方法,所以会话无效,盖子“用户”实例从会话中删除,同时我想取消任务,因为它会使下一个用户的会话无效,所以我调用 MyTask 对象的取消方法。
-
我得到的是:您登录并执行“logIn”方法。这会为“任务”分配一个不同于 null 的值。然后您手动注销并执行“logOut”方法,这会引发异常,因为“task”为空。这意味着您从未执行过“logIn”,或者您在其他地方将值设为空。
-
确实这是我的问题,实例化后任务实例永远不会或无处为空
-
第一段代码属于哪里?在一些 Stripes 相关的 bean 中?如果是这样,那么这可能与 servlet 无关。我至少只能说在长期运行的 Java EE webapp 中使用
Timer是灾难的根源(与您当前遇到的问题类型无关)。考虑查看java.util.concurrentAPI。
标签: java servlets login logout stripes