代码中的计时器

时间:2016-02-11 06:15:18

标签: java session

我想在java应用程序中创建一个计时器,用户可以在预定义的时间内登录该应用程序。一旦计时器值达到零,他/她将松开其会话对象并自动退出。

在会话期间,如果用户在预定义的时间内执行某些任务,他的会话时间将增加,否则他的时间将减少....一旦他达到预定义的低时间,他将无法再次登录。< / p>

建议定时器对当前会话产生影响的一些方法。

谢谢:)

2 个答案:

答案 0 :(得分:2)

声明:

我可以看到安全相关的理由来做这样的事情。我已经看过几次这种方法和各种应用程序,所以我可以理解为什么这样的要求会提高。当然,我不认为一般来说这是一个很好的想法,但是根据要求,我会分享我的想法并提供解决方案。

由于您在此处讨论会话,我认为您已进入网络域。

IMO有几种方法可以解决这个问题。

  • 假设每个客户都分配了HttpSession

    创建会话后第一次通话时,请输入当前时间&#39;进入它。然后创建一个Filter,在第一个请求执行上述逻辑时,并在每个请求时将当前时间与第一个请求期间设置的时间进行比较。如果差异小于允许时间 - 继续执行,否则强制注销,删除会话和所有内容。我想在此之后用户将被迫重新连接。

<强> 实施例

假设允许用户登录10分钟

然后在过滤器中的任何后续请求(伪代码)中:

  doFilter() {

    // if its a first request:
     if(httpSessionIsCreatedInThisRequest() && noFirstLoginTimeOnSession()) {
         httpSession.put("FIRST_LOGIN_TIME", getCurrentTime())
     }
     else { // for any subsequent request
      currentTime = getCurrentTime()

      if(currentTime - getFromSession("FIRST_LOGIN_TIME") < 10 mins) {
         // you can proceed
      } 
      else {
          logout()
         //do whatever You Need Here: logout, destroy the session
      }
     }
  }

这个解决方案对于简单的情况来说已经足够了,但是对于分布式应用程序是不够的(它没有扩展)。此外,如果你有很多用户,为每个用户维护一个HttpSession是一个很大的开销,因为HttpSession-s只是不够可扩展,你不想要一个会话复制,因为它总是很痛苦:)

  • 除了HttpSession,您可以通过Cookie实现相同的逻辑,但我怀疑Security-Wise它是否足够好。我之所以提到这一点,是因为我不了解您的任何安全问题。

  • 更具可扩展性的方法。而不是使用HttpSession,使用一些持久的键值存储/东西,如Redis服务器。将所有信息存储在那里。

    根据具体的后备技术,您可以选择使用分配给数据库中每条记录的TTL。您可能知道这一点,但为了完整答案:TTL(生存时间)意味着您指定服务器(清除)自动擦除对象的时间而不受干扰。因此,在这种情况下,您只需要检查对象是否存在。这可以在许多服务器上完成,因为假设它们处于同步状态,在这种情况下,它们不会共享有关用户的任何信息,因此可以更好地扩展。

现在您已经注意到所有这些解决方案根本不使用计时器。 定时器可能很昂贵,如果你使用java util timer每个用户它使用引擎盖下的线程。因此,有多少线程绑定到用户数是一个坏主意恕我直言。

您可以使用Quartz(这是一个调度框架)之类的解决方案,但同样,如果您尝试为不同的用户创建不同的触发器,它将成为一个混乱且不可维护的代码。 此外,如果你有太多的工作/触发器,Quartz开始滞后,这不是你想要的。最重要的是,我并不相信你应该在这种特殊情况下使用它。石英是一个很好的产品,不要误解我的意思,我认为它并不适合你的需求。

希望这有帮助

答案 1 :(得分:0)

将其保存在您的web.xml文件中

<session-config>
    <session-timeout> 1000 </session-timeout>
</session-config>