我知道这很有可能被标记为重复,但是找不到我要找的东西
这是一个常见问题,我敢肯定它有一些定义明确的最佳实践解决方案
背景
单个页面的SaaS应用程序具有很多拖放功能,用户可以在不进行大量服务器通信的情况下与之交互
服务器会话仅使用非持久会话cookie来保存用户对象
X小时后,会话在服务器上到期
有些东西仅在登录时加载
问题
- 用户在应用程序上工作,完成后,用户不会注销,只是保持浏览器保持打开状态
- 用户超过X个小时后返回(会话在服务器上无效)
- 用户无需服务器连接即可与应用进行交互(拖放内容,文本编辑...)
- 仅在下一次服务器交互时(假设没有自动保存),用户将被抛出到登录页面,并丢失一些工作
可能的解决方案
这是我想到的一些解决方案,想听听是否还有其他解决方案,以及其中是否有任何根本性的错误。
1.永远不要注销用户
- 怎么样?保持长时间的会话,保持持久的cookie或javaScript“保持活动” ping
- 优点:用户无需担心任何事情,可以为他们解决问题
- 缺点:不符合PCI标准,不安全,并且需要进行开发更改,例如仅在用户登录时加载到会话的内容需要转移到pub子模型(侦听事件更改)或具有缓存超时。
2.本地存储
- 怎么样?如果注销,使用新的本地存储临时存储状态,重定向到登录页面,登录后永久保存
- 优点:也是“离线工作”支持的基础,而不仅仅是处理会话超时
- 缺点:难以实施,需要对数据树进行状态合并,并非所有浏览器都支持
3.自动保存
更改模型的每个用户操作都应立即保留(或通过某种客户端队列),例如,如果他们选中了复选框,更改了文本字段或拖放了某些东西,则一旦完成,就保留更改。
- 怎么样?使用MV **框架(Backbone.js / Knockout.js / Ember.js / Angular.js等)绑定模型,并坚持更改。
- 优点:似乎是一个干净的解决方案,只要用户处于活动状态,会话就处于活动状态,如果不坚持下去,则不会进行任何客户端工作。
- 缺点:会话超时丢失后,用户上一次执行的操作。
4.会话过期后注销用户
这可以有几种方法
询问服务器“会话已过期”-这有点像22 /薛定inger的猫,因为服务器的唯一问题是延长了会话(重新启动超时),
- 怎么样?要么有一个服务器支持这样的问题(我什么都不知道,但是我来自Java领域),或者可以只保留一张会话ID表,手动上一次访问时间,然后通过传递会话来询问服务器。 ID作为参数而非cookie的参数,我不确定这是否可行,但是听起来很危险,不安全且设计不佳。
- 优点:如果服务器中有这种本机支持,这听起来像是一个干净,合理的问题(询问用户X是否仍然有会话,如果有则不进行更新)
- 缺点:如果服务器不支持它(同样,我不知道是否有服务器或框架具有此功能),则解决方法可能会带来巨大的安全风险。
我听说的一种解决方法是在服务器端进行一次简短会话,并在客户端ping保持活动状态ping,最多可以ping
- 怎么样?服务器上的简短会话,客户端ping每个sessionTimeOut / 2,最大重试次数为Y。
- 优点:可以解决问题,快速又脏
- 缺点:感觉像黑客一样,自己处理会话续订而不是让服务器执行
客户端计时器
怎么样?在客户端上有一个计时器,并通过在每个请求上重新启动该计时器使其与服务器同步,以使其等于最大服务器会话超时减去某些填充,在用户未向服务器发送任何请求后,UI会显示“会话为即将超时,您要继续吗?” (就像您在网上银行一样)
优点:解决问题
- 缺点:除了需要确保同步正常工作外,别无其他
问题
我可能在上述分析中缺少某些内容,可能有一些愚蠢的错误,希望您能提供帮助来纠正它们。为此,我还有什么其他解决方案?
now
。4.2听起来是杀死服务器并增加成本的好方法。4.3在android上,当我返回主屏幕时,我确定该过程已暂停,这也可能会干扰您的客户端计时器。