我们的API返回一个用户身份验证代码,该代码具有会话到期时间(30分钟不活动)。因此,如果我们使用auth令牌进行api呼叫,它会将会话更新为从通话时起30分钟。
在不活动30分钟后,api会返回一个错误,表示令牌已过期。此时我们应该请求一个新的身份验证令牌。
但是,显而易见的方法(向用户显示登录屏幕并让他们再次登录)将意味着在应用程序的某些功能中切断用户。
例如,我们有各种带有选项和输入的视图控制器,它们在流程结束时聚合并提交一个完整的API调用。如果会话在服务器上到期,而用户正在填写这些输入和视图,那么它们将在API调用时被注销,并且他们将在这些视图中失去进度。
有两种可能的解决方法:
我们在自己的应用中设置了计时器,以确保用户在应用程序停用30分钟后退出。这意味着它们不会在一组输入中被注销,但这会带来以下问题:即使我们运行自己的计时器,服务器API仍可能会过期。因此,这不起作用。
我们每隔10秒钟向服务器轮询一次,询问API身份验证令牌是否仍然有效。这会吃掉电池,数据和各种各样的东西,但这不是一种合理的做法。
有没有人有任何想法?
由于 汤姆
答案 0 :(得分:1)
根据您的描述,这听起来像是经典的失败交易问题。如果您不熟悉交易处理,“Nuts and Bolts of Transaction Processing”是该主题的入门读物。
如果您能够修改后端系统,则需要确保ACID后端。
这可能意味着在客户端上构建数据,并且在完成交易之前不会将数据发送到服务器。这样,如果会话超时,客户端仍然拥有完成事务所需的所有数据。 (利用原子性)
这可能意味着拥有一个交易令牌。在创建新会话时,客户端可以向服务器发送事务令牌,并在新会话中恢复事务的状态。 (杠杆耐久性)
对我来说,这两个选项都比擦除现有交易并强制用户重新开始更好。
希望有所帮助。