我正在尝试在我的Android应用程序中维护用户登录会话(1小时)。当用户登录时,我从服务器接收登录时间(StartTime)和会话结束时间(Timemout)。
我正在使用System api(System.currentTimeMillis())将收到的登录时间+会话结束时间与当前设备时间进行比较。
我的问题是用户可以通过更改位置或更改设备中的时钟时间来操作System.currentTimeMillis(),并且可以进行无限次登录会话。
我还尝试使用SystemClock.elapsedRealtime(),它取决于启动时间。用户可以通过重新启动设备来重置或控制时间。
反正还有1小时的登录时间吗?
从服务器接收到的StartTime和Timeout时间。
(((开始时间+超时)>(System.currentTimeMillis()/ 1000))
或
(((startTime + timeout)>(SystemClock.elapsedRealtime()/ 1000))
答案 0 :(得分:2)
此处的目标是确保会话不会超过特定的时间长度,而不管设备本地时间的日期/时间如何变化。这里的一个常数是服务器的时间,因此让我们利用它。
简而言之,该应用始终处于两种状态之一。它要么未经身份验证并等待用户登录,要么经过身份验证并在计时器上确定何时将其再次锁定用户。这样,您就不必如此频繁地ping服务器来检查会话状态
如前面的链接中所述,System.nanoTime()是在计时器中使用的好工具,该计时器不受本地时间更改的影响。在java docs
中有更多详细信息答案 1 :(得分:0)
这可以在服务器端处理。您可以在服务器上为该用户创建一个会话,该会话将在1小时后超时(在要求中指定)。
在这种情况下,您可以通过以下任何一种方式通知用户有关会话注销的信息:
如果会话超时后出现任何请求,则它将在会话注销时通知用户。
会话过期后,服务器可以在会话注销后向客户端发送通知。