【问题标题】:timertask-based logout give me problems基于timertask的注销给我带来了问题
【发布时间】: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.concurrent API。

标签: java servlets login logout stripes


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多