我设计的计数器如下。
我从服务器得到了秒钟。并转换为小时,分钟,秒。
timerInterval = setInterval(
function()
{
if(hours.toString().length == 1){hours = "0"+hours;}
if(minutes.toString().length == 1){minutes = "0"+minutes;}
if(seconds.toString().length == 1){seconds = "0"+seconds;}
if(seconds > 0){
seconds--;
if(seconds.toString().length == 1){seconds = "0"+seconds;}
}
else if(seconds == 0 && (minutes > 0)){
minutes = minutes - 1;
seconds = 59;
}
else if(minutes == 0 && (hours > 0)){
hours = hours - 1;
minutes = 59;
}
if(hours == 0 && minutes ==0 && seconds ==0){
clearInterval(timerInterval);
localStorage.removeItem("endTime");
$(".submitTest").click();
}
$("#timer").html(hours+":"+minutes+":"+seconds);
localStorage['endTime'] = (hours*3600+minutes*60+seconds);
},1000);
显示计时器。
问题
用户可以编辑计时器并作弊。
我找到的解决方案
1)将上次定时器存储在服务器端。当用户提交时,我们可以根据存储在服务器中的时间计算提交时间。
**Problem**: If I send submission time, user can edit it. So no use of storing
it in the server.
2)我可以在计时器到期或用户提交时将数据发送到服务器。 然后我根据服务器中的商店时间检查当前时间。
问题:服务器中存储的时间:晚上10:25。 服务器将数据发送到客户端,持续时间为晚上10点的25分钟。
数据到达客户端必须有延迟。例如,它到达10:00 05秒。并且用户在25分钟后准确提交[表示计时器到期]。并且到达服务器的数据必须有延迟。所以它在10:25 20s [05 + 15秒延迟]达到。我将结束时间存储在服务器中,时间是晚上10:25。因此,当用户作弊时,20秒的延迟会失败。
解决方案是有+/-时间。例如,我允许10:27 pm作为有效时间[2分钟额外]
但是这2分钟怎么会是有效的呢?
3)服务器已发送事件 我遇到的问题与第二个问题相同。 但是这里的解决方案是不同的:如果计时器在服务器端到期,则从用户收集数据而不等待他的提交,并在服务器端执行提交操作。但仍然可以阻止JS将数据发送到服务器。
如何解决此计时器问题?有什么建议吗?
答案 0 :(得分:0)
我建议在用户需要页面时存储会话,并将会话中存储的时间发送到页面并保持计时器在前端运行。当用户进行提交时,您在服务器端检查存储在会话中的时间和提交的时间,当然会有几秒或几毫秒的差异。因此,您可以定义一个保证金作为欺诈行为。