java - 如何维护用户登录 session ?

标签 java android session systemtime

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

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

我的问题是用户可以通过更改位置或更改设备中的时钟时间来操纵此 System.currentTimeMillis(),并且可以拥有无​​限的登录 session 。

我还尝试使用依赖于启动时间的 SystemClock.elapsedRealtime()。用户可以通过重启设备来重置或操纵时间。

有没有办法保持 1 小时的登录 session ?

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

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

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

最佳答案

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

  1. 在应用启动时,让您的应用查询服务器以查看它是否有 Activity session 。如果没有,请向用户显示登录屏幕。
  2. 如果有 Activity session ,服务器应返回该 session 的剩余持续时间。这意味着您的服务器将跟踪登录的设备以及登录时间。这样,当收到身份验证请求时,它会检查其列表中是否有过去一小时内的成功登录,并返回当前时间与上次登录时间之间的差值。如果在过去一小时内没有成功登录,则请求失败
  3. 应用程序端,当身份验证请求成功时,我们会启动一个计时器,计时从服务器返回的时间长度。您可以自己实现,也可以只使用 ScheduledThreadPoolExecutor。无论如何,您的计时器不能在其实现中使用 System.currentTimeMillis() ,否则它将受到本地时间更改的影响。引用this回答更多信息。
  4. 当计时器结束时,您可以将用户锁定并强制他们重新登录,或者只是让他们留下来直到应用程序关闭。这取决于您和您在用户体验和安全方面的优先事项。

简而言之,应用程序始终处于两种状态之一。它要么未经身份验证并等待用户登录,要么经过身份验证并在计时器上再次锁定用户。这样,您就不必经常 ping 服务器来检查 session 状态

正如前面链接中提到的,System.nanoTime() 是一个很好的工具,可以在定时器中使用,它不应受到本地时间变化的影响。更多详细信息,请参阅 java docs

关于java - 如何维护用户登录 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57380427/

相关文章:

Android - 错误 : com. facebook.FacebookException:无法获取应用名称

android - 阻止 iOS/Android 设备锁定屏幕/节能模式

angularjs - 响应状态为零的 Express Redis session 崩溃

PHP curl 返回奇怪的字符

java - 错误 "org.postgresql.Driver is not a valid javax.sql.DataSource implementation"不会影响任何内容。如何去除它?

由于没有窗口焦点,Android 错误取消事件

java - CdiJtaProcessEngineConfiguration 在加载事务管理器之前请求事务管理器

python - tf.train.MonitoredTrainingSession 参数

java - 使用 Java 接口(interface)等 Obj-C 协议(protocol)实现类的可插拔性

java - NetBeans - 每次我必须调试时都必须清理构建