基于WebSocket进行用户强制实时下线的方法与流程

文档序号:25490444发布日期:2021-06-15 21:55阅读:1315来源:国知局
基于WebSocket进行用户强制实时下线的方法与流程

本发明涉及web应用处理技术领域,具体地,涉及一种基于websocket进行用户强制实时下线的方法。



背景技术:

一般web应用处理用户强制下线的方式:首先在服务端记录所有登录用户会话session,然后对客户端发起的请求进行全局拦截,判断会话是否有效,无效则响应401,最后客户端对所有响应全局拦截,若为401状态则提示下线,或直接跳转到登录页面。在此流程中,为了提高实时性,可能会采用客户端定时轮询请求的方式,主动触发用户登录状态校验。

存在问题:

1.时效性问题。必须要由客户端主动发起请求,服务端拦截后才能进行下线提示,若无请求则客户端一直不会提示。

2.并发请求问题。请求响应401状态表示未认证登录,存在未携带认证凭据和认证凭据失效两种情况,对服务端而言,区别是一个只能提示未登录,另一个能提示具体失效原因,但最终客户端处理时都会清除本地认证凭据。若用户在认证凭据失效的情况下,打开web应用的某个页面,并发发起多个请求,服务端正常进行全局拦截,在第一个带失效原因的401响应回到客户端时,客户端会清掉本地认证凭据,此时仍并发请求可能仍未结束,导致后续请求都未携带认证凭据,返回了不带原因的401响应。这种情况下,一方面是无法准确提示下线原因,造成客户端处理逻辑的复杂化,另一方面,客户端对于大量401响应需要做重复无用的处理。

3.局限性问题。客户端进行全局的请求响应拦截,但是存在如下载、内嵌页面请求等特殊请求无法拦截(如客户端为浏览器时,下载操作属于浏览器行为,其响应不在web应用的控制之中),导致无法正常提示下线,需要操作其它功能页面以触发请求才能正常提示。

4.性能浪费问题。客户端主动轮询请求能够提高一定的实时性,但是会增加服务端的性能浪费,需要根据业务需要调整轮询频率。

专利文献cn111949918a(申请号:cn202010853271.7)公开了一种基于分布式环境下的websocket连接优化方法,包括:websocket服务器接收用户终端发送的用于建立连接的第一连接请求消息;对得到第二连接请求消息,发送给连接管理服务器;连接管理服务器根据websocket服务器id、用户终端id和应用key,查询是否存在websocket服务器id对应的用户终端id的连接;当存在时,生成第一关闭连接请求消息发送给websocket服务器id对应的websocket服务器;websocket服务器根据第一关闭连接请求消息,确定与用户终端连接的应用key,并关闭与用户终端的应用key对应的应用之间的连接;根据第一连接请求消息,重新建立与用户终端的连接。



技术实现要素:

针对现有技术中的缺陷,本发明的目的是提供一种基于websocket进行用户强制实时下线的方法。

根据本发明提供的基于websocket进行用户强制实时下线的方法,包括:

步骤1:用户登录,服务端维护用户会话;

步骤2:服务端监听用户会话变化,通过websocket发送下线消息到用户在线状态服务中;

步骤3:服务端拦截所有http请求,校验所属用户会话是否有效;

步骤4:客户端连接websocket服务;

步骤5:客户端订阅websocket用户在线状态服务;

步骤6:客户端通过websocket接收到用户下线消息;

步骤7:客户端发起http请求,被服务端拦截后发现所属会话失效,表明用户已下线;

步骤8:客户端进行下线处理。

优选的,所述步骤1包括:

步骤1.1:在客户端通过用户的账号凭据向服务端发起登录请求;

步骤1.2:服务端进行账号认证并创建会话,服务端获取账号凭据后,查询数据库用户信息进行匹配校验,校验通过后生成用户会话标识sid;

步骤1.3:服务端维护用户会话白名单,白名单用于记录当前所有的有效会话记录,以key-value的数据结构形式,key为用户会话标识sid,value为当前用户标识uid、登录时间的登录信息,存储到分布式缓存服务中,缓存过期时间为用户会话有效期;

步骤1.4:服务端维护用户会话黑名单,用于记录过去预设时间内的无效会话记录,包含会话下线原因详情,所有从白名单移除的会话,都会移入到黑名单中;

步骤1.5:服务端响应登录请求,服务端返回包含用户会话标识sid、用户标识uid的认证凭据token给客户端;

步骤1.6:客户端保留认证凭据token,待后续请求时携带到服务端。

优选的,所述步骤2包括:

步骤2.1:服务端监听用户会话黑名单的新增事件;

步骤2.2:获取新增事件对应的用户会话记录,以用户会话标识sid为key获取其映射的websocket会话标识ws-sid,继而以ws-sid向订阅了用户在线状态服务的websocket会话发送用户会话记录,包含下线原因等信息,进行下线消息通知。

优选的,所述步骤3包括:

步骤3.1:服务端对所有常规请求进行全局拦截,获取其携带的认证凭据token中的用户会话标识sid;

web程序运行在tomcat或undertow服务器容器中,通过容器本身提供的过滤器类,或者程序语言java提供的拦截器类,对进入的请求进行筛选拦截处理,获取到携带的参数信息,放行对有效信息,打回对无效信息;

步骤3.2:判断用户会话标识sid是否在用户会话白名单缓存中,若不在,则说明当前会话失效,同时以会话标识sid为key,在用户会话黑名单中查找详细下线原因,终止请求流程,将响应状态设置为401,同时返回具体下线信息。

优选的,所述步骤4包括:

步骤4.1:客户端向服务端发起websocket连接;

步骤4.2:服务端接收到websocket连接后,服务端根据负载均衡策略进行转发到集群服务中;

步骤4.3:集群服务校验客户端是否登录,未登录拒绝连接,是否登录通过判断携带token中的用户会话标识sid是否在用户会话白名单缓存中;

步骤4.4:校验通过的客户端建立websocket连接。

优选的,所述步骤5包括:

步骤5.1:客户端通过固定的订阅地址订阅用户状态服务,通过stomp协议,服务端推送消息到指定用户和指定会话下;

步骤5.2:服务端接收到websocket订阅后,根据负载均衡策略将订阅请求转发到分配的集群服务中;

步骤5.3:集群服务校验客户端用户是否已经登录,否则拒绝订阅请求;

步骤5.4:校验通过的客户端接收订阅;

步骤5.5:服务端获取当前websocket连接的会话标识ws-sid及用户会话标识sid,建立两者的映射,以key-value的数据结构形式,key为sid,value为ws-sid,存储到分布式缓存服务中,同时通过监听websocket断开连接状态来移除维护。

优选的,所述步骤6包括:在当前用户会话由于具体业务限制被挤下失效时,客户端会通过websocket实时收到当前用户会话的下线消息。

优选的,所述步骤7包括:

步骤7.1:在客户端不支持websocket或websocket连接不稳定的情况下,未及时收到服务端的下线通知,继而客户端携带失效的认证凭据token,在页面进行正常功能操作,发送业务请求;

步骤7.2:服务端对请求进行全局校验,在用户会话失效的情况下响应401请求。

优选的,所述步骤8包括:

步骤8.1:客户端通过被动接收到用户下线消息,或主动请求时发现响应状态为401,得知当前会话已失效;

步骤8.2:根据下线信息,向用户强制展示提示信息,同时禁止所有功能操作,并清除本地保留的认证凭据token;

步骤8.3:用户确认下线信息后,客户端跳转至登录页面。

优选的,会话是否失效下线是根据实际业务需求设置的,同一个帐号在两处登录,先登录的会被后登陆的挤掉,将先登陆的会话标记为失效,客户端通过http或websocket方式得知会话失效,同时服务端对于后续继续属于该会话的请求进行拦截打回。

与现有技术相比,本发明具有如下的有益效果:

(1)通过采用服务端主动推送用户在线状态的方式,解决了传统使用http请求拦截方式进行强制下线提示的时效性问题、并发请求问题、局限性问题、性能浪费问题;

(2)通过采用在分布式缓存中维护用户会话白名单和黑名单的方式,只记录有效的会话和失效不久的会话,精简了数据结构和记录数量,降低了维护成本的同时提高了处理性能。其中维护的黑名单中使强制下线更加详细化、多样化、灵活化,优化了用户体验;

(3)通过采用http请求主动获取用户状态为主要手段,websocket连接推送用户状态为补充手段的方式,两者互为补充,在保证稳定性及安全性的前提下,提高了及时性,优化了用户体验;

(4)通过采用载均衡策略进行转发到集群服务中的方式,从而实现了高并发、单服务故障的情况下服务的高可用;

(5)通过采用固定“/user/queue”前缀的websocket订阅地址,然后由服务端获取当前用户会话信息作为参数的方式,避免了需要为每次订阅分配唯一订阅地址的问题,以及解决了用户登录状态校验和防止订阅地址被恶意使用的问题;

(6)通过采用将websocket会话与用户http会话映射的方式,解决了同一用户下存在多个会话,推送用户下线消息到指定用户下指定会话;

(7)通过采用分布式缓存服务,使此方法使用于集群应用。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为本发明方法流程图。

具体实施方式

下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。

实施例:

在应用中,通过websocket进行用户强制实时下线,客户端订阅用户在线状态服务,接收到实时下线消息后,清除本地凭证并提示用户。

如图1,根据本发明提供的基于websocket进行用户强制实时下线的方法,包括:

在分布式缓存中维护用户会话白名单和黑名单,以简化会话有效性判断流程,同时丰富下线提示内容;

在websocket服务中订阅用户在线状态,以获取实时的用户强制下线消息,客户端据此进行下线处理;

在通过http请求拦截校验会话状态的基础上,增加websocket推送,保证用户强制下线的稳定性,同时提高实时性,优化用户体验;

步骤1:用户登录,服务端维护用户会话;

(1)客户端发起登录请求。客户端通过使用用户填写的账号凭据如用户名和密码,向服务端发起登录请求;

(2)服务端进行账号认证并创建会话。服务端获取账号凭据后,查询数据库用户信息进行匹配校验,校验通过后生成用户会话标识sid;

(3)服务端维护用户会话白名单。白名单用于记录当前所有的有效会话记录。以key-value的数据结构形式,key为用户会话标识sid,value为当前用户标识uid、登录时间等登录信息,存储到分布式缓存服务中,缓存过期时间为用户会话有效期;

(4)服务端维护用户会话黑名单。用于记录过去短时间内的无效会话记录,包含会话下线原因详情。所有从白名单移除的会话,都会移入到黑名单中,如业务需求中要求,同一时间同一用户只允许一个会话存在,则首先将当前登录用户下其它会话记录从白名单移入黑名单中,后将当前会话记录到白名单中。以key-value数据结构形式,key为用户会话标识sid,value为用户标识uid、下线时间、下线原因等下线信息,存储到分布式缓存服务中,该缓存只需短时间(如1小时)有效;

(5)服务端响应登录请求。服务端返回包含用户会话标识sid、用户标识uid等信息的认证凭据token给客户端;

(6)客户端保留认证凭据token,待后续请求时携带到服务端。

步骤2:服务端监听用户会话变化;

(1)服务端监听用户会话黑名单的新增事件;

(2)获取新增事件对应的用户会话记录,以其用户会话标识sid为key获取其映射的websocket会话标识ws-sid(映射详情见步骤5),继而以ws-sid向订阅了用户在线状态服务的websocket会话发送用户会话记录,包含下线原因等信息,进行下线消息通知。

步骤3:服务端拦截校验所有请求;

(1)服务端对所有常规请求进行全局拦截,获取其携带的认证凭据token中的用户会话标识sid;

(2)判断用户会话标识sid是否在用户会话白名单缓存中,若不在,则说明当前会话失效,同时以会话标识sid为key,在用户会话黑名单中查找详细下线原因,终止请求流程,将响应状态设置为401,同时返回具体下线信息;

步骤4:客户端连接websocket服务;

(1)客户端向服务端发起websocket连接;

(2)服务端接收到websocket连接后,服务端根据负载均衡策略进行转发到集群服务中;

(3)集群服务校验客户端是否登录,未登录拒绝连接。是否登录通过判断携带token中的用户会话标识sid是否在用户会话白名单缓存中;

(4)校验通过的客户端建立websocket连接。

步骤5:客户端订阅websocket用户在线状态服务;

(1)客户端通过固定的订阅地址如“/user/queue/online-status”订阅用户状态服务。该订阅地址为“/user/queue/”前缀,通过stomp协议(基于websocket的上层协议,类似http和tcp的关系)服务端可以精准推送消息到指定用户甚至指定会话下;

(2)服务端接收到websocket订阅后,服务端将订阅请求根据步骤4中负载均衡策略转发到分配的集群服务中;

(3)集群服务校验客户端用户是否已经登录,否则拒绝订阅请求。登录判断根据步骤4中的校验策略;

(4)校验通过的客户端接收订阅;

(5)服务端获取当前websocket连接的会话标识ws-sid及用户会话标识sid,建立两者的映射。以key-value的数据结构形式,key为sid,value为ws-sid,存储到分布式缓存服务中,长久有效,同时通过监听websocket断开连接状态来移除维护;

步骤6:客户端被动接收用户下线消息;

在当前用户会话由于具体业务限制被挤下失效时,客户端会通过websocket实时收到当前用户会话的下线消息。

步骤7:客户端主动发现用户已经下线;

(1)在客户端不支持websocket或websocket连接不稳定的情况下,未及时收到服务端的下线通知。继而客户端携带失效的认证凭据token,在页面进行正常功能操作,发送业务请求;

(2)由于步骤3中服务端会对请求进行全局校验,在当前用户会话失效的情况下会响应401请求。

步骤8:客户端进行下线处理;

(1)客户端通过被动接收到用户下线消息,或主动请求时发现响应状态为401,得知当前会话已失效;

(2)根据下线信息,向用户强制展示提示信息,如“您的账号于16:29在其他设备登录,当前设备已被下线。如非本人操作,建议您修改密码”,同时禁止所有功能操作,并清除本地保留的认证凭据token;

(3)用户确认下线信息后,客户端即可跳转至登录页面。

本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1