繁体   English   中英

如何维护用户登录会话?

[英]How to maintain user login session?

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

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

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

我还尝试使用SystemClock.elapsedRealtime(),它取决于启动时间。 用户可以通过重新启动设备来重置或控制时间的位置。

无论如何,要维持1小时的登录时间?

从服务器接收的StartTime和Timeout时间。

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

要么

((开始时间+超时)>(SystemClock.elapsedRealtime()/ 1000))

此处的目标是确保会话不会超过特定的时间长度,而不管设备本地时间的日期/时间如何变化。 这里的一个常数是服务器的时间,因此让我们利用它。

  1. 在应用启动时,使您的应用查询服务器以查看其是否具有活动会话。 如果不是,请向用户显示登录屏幕。
  2. 如果存在活动会话,则服务器应返回该会话的剩余持续时间。 这意味着您的服务器将跟踪哪些设备已登录以及何时登录。 这样,当收到身份验证请求时,它将检查其列表中是否有最近一次登录成功的信息,并返回当前时间与上次登录时间之间的差额。 如果最近一小时没有成功登录,则请求失败
  3. 在应用程序端,当身份验证请求成功时,我们将启动一个计时器,等待服务器返回的时间长度。 您可以自己实现,也可以只使用ScheduledThreadPoolExecutor。 无论如何,您的计时器不能在其实现中使用System.currentTimeMillis(),否则它将受到本地时间更改的影响。 有关更多信息,请参阅答案。
  4. 计时器结束后,您可以将用户锁定并强制他们再次登录,或者干脆让他们停留在该应用程序关闭之前。 这取决于您和用户体验和安全性的优先事项。

简而言之,该应用始终处于两种状态之一。 它要么未经身份验证并等待用户登录,要么经过身份验证并在计时器上确定何时将其再次锁定用户。 这样,您就不必如此频繁地ping服务器来检查会话状态

如前面的链接中所述,System.nanoTime()是在计时器中使用的好工具,该计时器不受本地时间更改的影响。 Java文档中的更多详细信息

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

在这种情况下,您可以通过以下任何一种方式通知用户有关会话注销的信息:

  1. 如果会话超时后出现任何请求,则它将在会话注销时通知用户。

  2. 会话过期时,服务器可以在会话注销后向客户端发送通知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM