Java 代码中的计时器

Java 代码中的计时器,java,session,Java,Session,我想在java应用程序中创建一个计时器,根据该计时器,用户只需在预定义的时间内登录应用程序。一旦计时器值达到零,他/她将释放其会话对象并自动注销 在会话期间,如果用户在预定义的时间内执行某些任务,则其会话时间将增加,否则其时间将减少……一旦达到预定义的最短时间,他将无法再次登录 建议计时器对当前会话产生影响的方式 谢谢:)将其保存在web.xml文件中 <session-config> <session-timeout> 1000 </session-tim

我想在java应用程序中创建一个计时器,根据该计时器,用户只需在预定义的时间内登录应用程序。一旦计时器值达到零,他/她将释放其会话对象并自动注销

在会话期间,如果用户在预定义的时间内执行某些任务,则其会话时间将增加,否则其时间将减少……一旦达到预定义的最短时间,他将无法再次登录

建议计时器对当前会话产生影响的方式


谢谢:)

将其保存在web.xml文件中

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

1000
免责声明:

我可以看到一个与安全相关的理由来做这样的事情。我已经多次见过这种方法和各种应用程序,因此我能够理解为什么会提出这样的要求。当然,我不认为一般来说实现这样的东西是个好主意,但是考虑到需求,我将分享我的想法并提供解决方案

既然您在这里谈论会话,我假设您在web域中

IMO有几种方法来解决这个问题

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

    创建会话时,在第一次调用时,将“当前时间”直接放入其中。然后创建一个
    过滤器
    ,在第一个请求执行上述逻辑时,在每个请求时,将当前时间与第一个请求期间设置的时间进行比较。如果差异小于允许的时间-继续执行,否则强制注销、删除会话和所有内容。我猜在这之后用户将被迫重新连接

示例:

假设允许用户登录10分钟

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

doFilter(){
//如果是第一次请求:
if(httpSessionIsCreatedInThisRequest()&&noFirstLoginTimeOnSession()){
httpSession.put(“第一次登录时间”,getCurrentTime())
}
else{//用于任何后续请求
currentTime=getCurrentTime()
if(当前时间-getFromSession(“首次登录时间”)<10分钟){
//你可以继续
} 
否则{
注销()
//在此处执行您需要的任何操作:注销、销毁会话
}
}
}
这个解决方案对于简单的情况来说已经足够好了,但是对于分布式应用程序来说还不够(它不能扩展)。此外,如果您有许多用户,那么为每个用户维护一个HttpSession是一项巨大的开销,因为HttpSession-s的可伸缩性不够,而且您不希望进行会话复制,因为这总是一件痛苦的事情:)

  • 作为HttpSession的替代方案,您可以通过Cookie实现相同的逻辑,但我怀疑它在安全方面是否足够好。我提到这一点是因为我不知道你在这里的任何安全问题

  • 更具伸缩性的方法。不要使用HttpSession,而是使用一些持久的键值存储/类似Redis server的东西。将所有信息都存储在那里

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

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


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

“有人能帮我写代码吗…”
--您误解了如何使用此网站,在进一步讨论之前,您需要浏览和部分内容。我希望找到解决问题的方法。您需要的代码不是此网站的工作方式。这不是一个“给我代码站点”。再次阅读链接,否则如果你继续这一系列的提问,你会有很多失望。对不起,我是这个网站的新手。我实际上尝试了一些代码,但没有得到所需的输出,我现在正在寻找建议。不,我不是在寻找这种方法,只有当用户在特定的时间段内处于非活动状态时,这才会结束会话,我想结束会话,即使用户处于活动状态。为什么要强制注销用户。。。guy?这是一个要求,我想限制用户只在特定的日期或时段登录特定的时间…访问此链接哇,谢谢…我正在寻找这样的信息。太棒了,我正在寻找这些详细信息,我的应用程序有一个模块,该模块只能由用户运行一段特定的时间,一旦任务在该时间段内完成,时间限制就可以延长。使用过滤器和当前时间+登录时间(来自会话)的方法可能很有用。非常感谢:)
  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
      }
     }
  }