在B/S架构中确定客户端是否在线的方法和系统 【技术领域】
本发明涉及网络技术,更具体地涉及在B/S架构中确定客户端是否在线的方法和系统。
背景技术
商业B/S应用软件往往需要针对在线用户数进行授权,这就需要实时准确的统计到当前在线人数。但是传统的方案,无法针对用户的操作习惯和终端突发情况,进行准确的统计。只能基于服务器端的用户会话数,进行一个粗略估计。
随着web2.0技术的蓬勃发展,基于浏览器的应用规模越来越大,复杂度越来越高。而其中的商业化软件,大多面临着终端用户授权控制的问题。由于传统的web应用,都是在服务器端通过保持“会话”来标识用户的登录状态,所以,需要终端浏览器在用户退出时,能准确的通知到服务器,以便服务器能将此“会话”清除。
但是,用户的退出方式是多种多样的:如通过应用界面向导“注销”登录,直接关掉浏览器,或者浏览器窗口“崩溃”退出,及用户误杀浏览器进程等。
传统的解决方案,往往只能解决用户主动“注销”登录,而无法检测其它方式。致使统计不准确。
进一步的方案是,监控用户关掉浏览器的行为,认为用户主动“注销”。这个方案存在的问题是:
在浏览器中,关闭和刷新事件相同,无法区分。所以会将用户刷新行为误当成“注销”。导致实际统计用户数减少。
在更进一步的解决方案中,通过刷新和关闭按钮的位置来区分究竟是刷新还是关闭。这种通过位置的方案根据用户使用的浏览器界面设置不同,以及操作模式不同(比如,有的终端用户习惯双击左上图标来关闭浏览器),还是存在很大的缺陷。同时,无法解决浏览器崩溃,用户误杀进程等特殊情况。
基于以上现存方案,会出现用户数统计不准确,用户虽退出却长时间显示在线的情况,这在商业授权应用中,是不能忽视的大问题。
【发明内容】
为了解决上述问题至少之一,本发明提供了一种在B/S架构中确定客户端是否在线的方法,包括:当客户端向服务器端发出预注销请求时,所述服务器端将所述预注销请求置于预注销会话队列中;以及所述服务器端定期轮询所述预注销会话队列和正常会话队列以确定所述客户端是否在线。
在上述技术方案中,优选地,所述服务器端定期轮询所述预注销会话队列和正常会话队列以确定所述客户端是否在线包括:所述服务器端确定所述预注销会话队列和所述正常会话队列中的会话是否过期;如果具有过期的会话,则删除所述过期的会话。
在上述技术方案中,优选地,所述服务器端通过以下步骤来确定会话是否过期:所述客户端每隔预定间隔向所述服务器端发送请求以标识所述客户端的存在;所述服务器端在接收到所述请求后,将所述预注销会话队列和所述正常会话队列中的所述客户端的会话的最新激活时间修改为当前请求时间;以及当所述服务器端在进行轮询时,如果会话的所述当前请求时间与轮询时间的差大于预定值,则所述服务器端确定该会话过期,否则为不过期。
在上述技术方案中,优选地,所述预注销请求包括以下至少之一:关闭请求、刷新请求。
在上述技术方案中,优选地,还包括:当所述预注销请求是所述刷新请求时,所述服务器端从所述预注销会话队列中提取所述刷新请求对应的会话,对所述预注销会话队列进行扫描,删除过期的会话。
本发明还提供了一种在B/S架构中确定客户端是否在线的系统,包括:请求组件,位于客户端上,用于向服务器端发出预注销请求;预注销会话队列,位于所述服务器端,用于保存来自所述请求组件的所述预注销请求;以及轮询组件,位于所述服务器端,用于定期轮询所述预注销会话队列和正常会话队列以确定所述客户端是否在线。
在上述技术方案中,优选地,所述轮询组件包括:确定单元,用于确定所述预注销会话队列和所述正常会话队列中的会话是否过期;以及删除单元,用于在所述确定单元确定具有过期的会话的情况下,删除所述过期的会话。
在上述技术方案中,优选地,所述确定单元包括:接收子单元,用于接收所述客户端每隔预定间隔向所述服务器端发送的标识所述客户端的存在的请求;修改子单元,用于在所述接收子单元接收到所述请求后,将所述预注销会话队列和所述正常会话队列中的所述客户端的会话的最新激活时间修改为当前请求时间;以及比较子单元,用于在所述轮询单元在进行轮询时,比较会话的所述当前请求时间与轮询时间的差是否大于预定值,如果大于,则确定该会话过期,否则为不过期。
在上述技术方案中,优选地,所述预注销请求包括以下至少之一:关闭请求、刷新请求。
在上述技术方案中,优选地,还包括:控制组件,位于所述服务器端,用于在所述预注销请求是所述刷新请求时,从所述预注销会话队列中提取所述刷新请求对应的会话,对所述预注销会话队列进行扫描,删除过期的会话。
总体而言,根据本发明的技术方案采用“会话”队列,Ajax(Asynchronous JavaScript and XML)技术,后台轮询等,解决了基于浏览器的应用难以实时准确统计在线用户数的问题。为B/S商业应用授权提供了可靠的技术方案。通过主动监听用户“注销”登录,提供针对关闭刷新浏览器的“预注销队列”,客户端与服务器端通信,后台主动轮询过期会话等一系列措施,能有效避免现有方案中的一些统计缺陷。对用户的主动“注销”,关闭或刷新浏览器,浏览器崩溃及进程误杀及其它可能的情况,都能够提供有效的用户数统计。
【附图说明】
图1示出了根据本发明的在B/S架构中确定客户端是否在线的方法地流程图;
图2示出了根据本发明的在B/S架构中确定客户端是否在线的系统的结构图;
图3示出了根据本发明的在B/S架构中确定客户端是否在线的方法的一个实施例的操作流程图;
图4示出了根据本发明的在B/S架构中确定客户端是否在线的方法的另一实施例的操作流程图;以及
图5示出了根据本发明的在B/S架构中确定客户端是否在线的方法的再一实施例的操作流程图。
【具体实施方式】
下面将参考附图详细说明根据本发明的。
图1示出了根据本发明的在B/S架构中确定客户端是否在线的方法的流程图。
该方法包括:步骤102,当客户端向服务器端发出预注销请求时,所述服务器端将所述预注销请求置于预注销会话队列中;以及步骤104,所述服务器端定期轮询所述预注销会话队列和正常会话队列以确定所述客户端是否在线。
在上述技术方案中,优选地,所述服务器端定期轮询所述预注销会话队列和正常会话队列以确定所述客户端是否在线包括:所述服务器端确定所述预注销会话队列和所述正常会话队列中的会话是否过期;如果具有过期的会话,则删除所述过期的会话。
在上述技术方案中,优选地,所述服务器端通过以下步骤来确定会话是否过期:所述客户端每隔预定间隔向所述服务器端发送请求以标识所述客户端的存在;所述服务器端在接收到所述请求后,将所述预注销会话队列和所述正常会话队列中的所述客户端的会话的最新激活时间修改为当前请求时间;以及当所述服务器端在进行轮询时,如果会话的所述当前请求时间与轮询时间的差大于预定值,则所述服务器端确定该会话过期,否则为不过期。
在上述技术方案中,优选地,所述预注销请求包括以下至少之一:关闭请求、刷新请求。
在上述技术方案中,优选地,还包括:当所述预注销请求是所述刷新请求时,所述服务器端从所述预注销会话队列中提取所述刷新请求对应的会话,对所述预注销会话队列进行扫描,删除过期的会话。
图2示出了根据本发明的在B/S架构中确定客户端是否在线的系统的结构图。
该系统包括:请求组件202,位于客户端上,用于向服务器端发出预注销请求;预注销会话队列204,位于所述服务器端,用于保存来自所述请求组件的所述预注销请求;以及轮询组件206,位于所述服务器端,用于定期轮询所述预注销会话队列和正常会话队列以确定所述客户端是否在线。
在上述技术方案中,优选地,所述轮询组件206包括:确定单元,用于确定所述预注销会话队列和所述正常会话队列中的会话是否过期;以及删除单元,用于在所述确定单元确定具有过期的会话的情况下,删除所述过期的会话。
在上述技术方案中,优选地,所述确定单元包括:接收子单元,用于接收所述客户端每隔预定间隔向所述服务器端发送的标识所述客户端的存在的请求;修改子单元,用于在所述接收子单元接收到所述请求后,将所述预注销会话队列和所述正常会话队列中的所述客户端的会话的最新激活时间修改为当前请求时间;以及比较子单元20626,用于在所述轮询单元在进行轮询时,比较会话的所述当前请求时间与轮询时间的差是否大于预定值,如果大于,则确定该会话过期,否则为不过期。
在上述技术方案中,优选地,所述预注销请求包括以下至少之一:关闭请求、刷新请求。
在上述技术方案中,优选地,还包括:控制组件208,位于所述服务器端,用于在所述预注销请求是所述刷新请求时,从所述预注销会话队列中提取所述刷新请求对应的会话,对所述预注销会话队列进行扫描,删除过期的会话。
图3示出了根据本发明的在B/S架构中确定客户端是否在线的方法的一个实施例的操作流程图。
在线用户统计方案包括以下部分:终端触发监听器,终端远程请求组件,服务器端会话池,服务器端预注销队列,服务器端过期轮询组件,服务器授权控制组件。
终端触发监听器:是用户注销操作的监听者,如果用户主动点击“注销”按钮,关闭或刷新浏览器,都将被它捕获到。
终端远程请求组件:将监听器监听到的注销请求,发送到服务器端。
服务器端会话池:维护当前在线用户的所有会话ID和用户ID的映射。
服务器预注销队列:保存无法判断是刷新或者关闭的会话的队列,可由应用程序或者服务器端过期轮询组件提取。
服务器端过期轮询组件:主动读取服务器端会话池和预注销队列,将已过期用户信息删除。
服务器授权控制组件:一般由各个具体应用提供,配合整个方案的调用,进行用户使用数的增加和删除。
从图3中可以看出,该方案的执行分为如下几个逻辑:终端用户主动点击“注销”向导时,由发送服务器请求,注销用户会话,从会话池中删除对应的会话ID和用户ID映射,及调用服务器授权控制组件减少使用数。
图4示出了根据本发明的在B/S架构中确定客户端是否在线的方法的另一实施例的操作流程图。
终端用户点击“刷新”或关闭浏览器时,由远程请求组件发送预退出请求道服务器,服务器端将用户会话设置当前时间戳,并加入预退出队列。这里分为两种情况:
1.刷新操作会重新请求当前页面。因此,在重新请求时,通过访问预退出队列,根据当前会话ID,将会话从预退出队列中提取出来,并将队列中的其它所有会话,按照时间戳,将已过期(当前时间和会话进队列时的时间戳差值大于设定值)的删除。从会话池中删除用户信息,并调用服务器授权控制组件。
2.关闭操作,由于不再请求页面,放在预退出队列中的会话,将一直滞留到过期,并被其它用户的“刷新”操作,轮询组件或程序中预先设置的触发点清除。
图5示出了根据本发明的在B/S架构中确定客户端是否在线的方法的再一实施例的操作流程图。
终端浏览器因意外情况崩溃或者用户误删浏览器进程。由于此类型操作使客户端没有机会发送请求给服务器。因此,这部分的准确统计是靠远程请求组件和轮询组件完成的。用户登录后,远程请求组件会每隔一个时间段(设定值)发送请求到服务器端,以标识此客户端还存在。服务器端将会话池中的最新激活时间更新成当前的请求时间。与此同时,服务器轮询组件每隔一个时间段会进行此会话池的轮询,一旦发现有过期会话,则从会话池中删除对应会话,并调用授权控制组件。
通过以上处理机制,可以针对用户的各种退出情况(无论是意外退出还是正常退出),做到实时,准确的统计在线用户数。
例:在B/S架构应用中,通过引入此方案,做到了不论用户使用的是什么类型的浏览器,以何种方式退出。授权控制组件都能通过调用基于此方案的接口,获取准确的在线用户数,从而实现商业授权。
该方案可用于需要精确统计在线用户数的B/S架构产品。由于WEB产品数量众多,如果每一套产品都采用独立的控制方案,不但增加了工作量,而且各个产品之间的控制模式各不相同,效果和质量也无法控制。并且如前所述,传统方案也无法做到准确控制用户的在线数,出现明明用户不在线,却出现达到授权数的奇怪现象。引入了统一的解决方案之后,所有WEB产品开发方式得到统一,工作量和维护量减少,解决了在线用户数的准确统计问题。而且统一的方案对后期的产品的集成和升级也带来了潜在的好处。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。