小白de架构哲学 - 系统单一用户在线

一、需求描述:

当用户的账号在另一个浏览器登录时,需要把当前浏览器的登录强制下线

二、业务流程

  1. 用户登录
  2. 处理用户请求
  3. 心跳请求(X-Keep-Alive

(一)用户登录

  • 登录采用任意登录模式均可以,主要生成当前客户端标识(X-XSRF-TOKEN
  • 记录用户的客户端标识,有两种方式:
    • 数据库则创建一张 UserOnline 表,字段:用户主键、客户端标识
    • 分布式缓存( Redis ), Hash 类型存储跟数据库意思相近 Key :用户主键,value:客户端标识

小白de架构哲学 - 系统单一用户在线_第1张图片

(二)处理用户请求

  • 客户端请求服务端资源(Api/文件等),进行身份验证,验证 Header 中的客户端标识
  • 验证记录用户的客户端标识是否是当前客户端 Header 中的(X-XSRF-TOKEN

有了上面的两个步骤,已经基本实现了单用户操作的需求,但是这样有个弊端,更准确的说是不太好的用户体验,就是当客户端对服务端资源发起请求之后,客户端才能知道自己有没有被强制退出,为了解决这个问题引入第三个步骤【心跳请求】

小白de架构哲学 - 系统单一用户在线_第2张图片

(三)心跳请求

客户端定时向服务端发送请求,检测当前用户是否在其他客户端进行登录操作了

在不影响性能的前提下,心跳请求越频繁,用户体验越好

四、优化

  • 客户端可以在第一次获取到服务端标识为【是否当前客户端登录标识】,客户端存储至客户端缓存(cookie
  • 客户端每次资源请求(含心跳请求)前判断【是否当前客户端登录标识】是否存在,存在则提示用户【您的账号已在另一台设备登录,请重新登录,非本人操作请尽快修改密码】

五、代码

// 代码先下次上吧

你可能感兴趣的:(Asp.Net,Core,小白de架构哲学)