Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何维护用户登录会话?_Java_Android_Session_Systemtime - Fatal编程技术网

Java 如何维护用户登录会话?

Java 如何维护用户登录会话?,java,android,session,systemtime,Java,Android,Session,Systemtime,我试图在我的Android应用程序中维护用户登录会话(1小时)。当用户登录时,我从服务器接收登录时间(StartTime)和会话结束时间(Timemout) 我正在使用系统api(System.currentTimeMillis())将收到的登录时间+会话结束时间与当前设备时间进行比较 我的问题是,用户可以通过更改设备中的位置或时钟时间来操作这个系统.currentTimeMillis(),并且可以拥有无限的登录会话 我还尝试使用SystemClock.elapsedRealtime(),它在启

我试图在我的Android应用程序中维护用户登录会话(1小时)。当用户登录时,我从服务器接收登录时间(StartTime)和会话结束时间(Timemout)

我正在使用系统api(System.currentTimeMillis())将收到的登录时间+会话结束时间与当前设备时间进行比较

我的问题是,用户可以通过更改设备中的位置或时钟时间来操作这个系统.currentTimeMillis(),并且可以拥有无限的登录会话

我还尝试使用SystemClock.elapsedRealtime(),它在启动时是可靠的。用户可以通过重新启动设备来重置或操纵时间

是否仍然需要维护1小时登录会话

从服务器接收的开始时间和超时时间

((开始时间+超时)>(System.currentTimeMillis()/1000))


((startTime+timeout)>(SystemClock.elapsedRealtime()/1000))

这可以在服务器端处理。您可以在服务器上为用户创建会话,该会话将在1小时后超时(在需求中指定)

在这种情况下,您可以通过以下任一方式通知用户会话已注销:

  • 若在会话超时后出现任何请求,则会在会话注销时通知用户

  • 会话到期时,服务器可以在会话注销时向客户端发送通知


  • 这里的目标是确保您的会话不会超过一定的时间长度,无论您的设备的本地时间是否发生任何日期/时间更改。这里的一个常量是服务器的时间,所以让我们利用它

  • 在应用程序启动时,让你的应用程序查询服务器,查看它是否有活动会话。如果没有,则向用户显示登录屏幕
  • 如果存在活动会话,服务器应返回该会话的剩余持续时间。这意味着您的服务器将跟踪哪些设备登录以及何时登录。这样,当身份验证请求传入时,它会检查其列表中最近一小时内是否成功登录,并返回当前时间与上次登录时间之间的差异。如果在最后一小时内没有成功登录,则请求将失败
  • 在应用程序端,当身份验证请求成功时,我们将启动一个计时器,计时器的长度为从服务器返回的时间长度。您可以自己实现,也可以只使用ScheduledThreadPoolExecutor。无论如何,您的计时器无法在其实现中使用System.currentTimeMillis(),否则将受到本地时间更改的影响。关于这方面的更多信息,请参阅答案
  • 当计时器结束时,你可以将用户锁定在外面,强迫他们再次登录,或者干脆让他们一直呆到应用程序关闭为止。这取决于您以及您在用户体验和安全方面的优先事项 简而言之,应用程序始终处于两种状态之一。它未经身份验证并等待用户登录,或者它已通过身份验证并在计时器上等待何时再次锁定用户。这样,您就不必经常ping服务器来检查会话状态


    正如在前面的链接中提到的,System.nanoTime()是一个很好的工具,可用于不受本地时间变化影响的计时器中。更改位置中的更多详细信息不会影响
    System.currentTimeMillis()
    。当然,更改时钟时间会有影响。您可以让服务器负责跟踪用户的登录时间?这是服务器应该负责的事情。客户端只应将其用作优化,以便为happy case提供更好的用户体验。如果用户超时,服务器应该拒绝请求。@CrazyProgrammerThing您可以使API返回未经验证的响应,当应用程序收到该响应时,它会弹出一个登录屏幕。当他们登录时,他们会被重定向到原始页面,然后重试该请求。@CrazyProgrammerThing是的,您可以在此实例中使用nanoTime。您还可以使用基于它的东西,例如ScheduledThreadPoolExecutor,这样您就不必重新发明轮子。