web在线考试系统检测用户是否掉线的问题
此系统在考试的时候是全屏的
该系统需要检测考生是否已经掉线,我就用jquery的$.ajax()方法进行轮询来检测,开发和测试的时候可以检测出用户掉线的问题。实际使用的时候,大概有400多个考生同时在线,只有2个考生出现了问题。问题的情况是考生已经掉线但系统没有提示。导致考生在表单里写了一大堆东西却无法提交。
这个问题快把我折磨疯了。根本没法测试,根本重现不了bug。
web
jquery
测试
------解决方案--------------------
那你应该解决的是客户端掉线后为什么无法连接到服务器的问题,而不是服务器判断客户端是否掉线的问题。
------解决方案--------------------
好吧,那问题还是必须要在客户端检测掉线....我想多了
不知道你在ajax轮询的时候这1%的考生返回的是什么样的信息,不论任何情况,正确的返回只有一种,就算post到离线页面也不会获得正确的反馈信息。
所以我想知道那1%考生是如何发现无法提交的?点击没有反应?error没执行?还是点完直接提示成功?
------解决方案--------------------可以尝试着去定时从服务器给每个session发送请求,每个考生那边都自动回应,服务器定时追踪考生所在session的回应。如果追踪不到这回应,证明session结束了。这只是个思路,具体的要你自己去实现了
------解决方案--------------------需要一个心跳系统,AJAX方式每隔10秒等时间访问一次服务器,服务器判断10秒没有心跳请求的算暂时掉线。
------解决方案--------------------应该首先排除session的问题,因为所有考生的session创建时间应该是接近的,系统对session的影响方式是相同的,在同一个应用下session不会出现不同的状况。
我一直不推荐靠js在客户端进行硬性的而且是唯一有效的检查,无论你的程序如何加密,客户端环境如何规范,浏览器动态脚本程序都不可能是绝对安全有效的,就连ls说的flash也可以被简单的通过浏览器设置屏蔽掉。
如果问题出现在生产环境,而且客户端控制程序存在可能的漏洞,而当事人却无法详细的描述问题或前后描述有出入,不排除是作弊的一种手段,毕竟这是考试,将问题推给考试系统似乎可以掩人耳目。
有没有可能通过长连接解决,而不是通过客户端心跳判断连接有效性?
有没有可能连接从最初就是无效的,因为连接总数超出了某些服务器端的限制?
如果问题一直无法重现,且客户端脚本能够确定有效,那就建议对脚本的具体行为进行记录,如:吊线前心跳状态,定期保存的请求提交了几次等等,客户端页面有没有被刷新,脚本有没有被重置等等可能对解决问题有帮助的信息。
------解决方案--------------------
赶紧升级服务器,心跳系统你值得一试.10秒太短,4分太长,该为30秒到一分钟就差不多了.还有就是考生的表单信息要定时去保存,等考生发现自己掉线,再次登陆的时候可以读取到上一次未提交的数据.这个很困难,貌似没见到什么网站能做的这么给力.