当前校验逻辑: 本地和服务端的时间校验绑定在一个通用请求上,这个请求每七分钟会到服务端请求一次,本地拿到服务器时间后,计算请求服务器来回的时间,最后得出与服务器时间的差值,然后每次new Date().getTime() 时候都会加上这个差值,保证时间的准确性,时间精确度在毫秒。

问题描述:问题是出现在用户手动修改过本机时间后,第一个七分钟内时间都是错乱的,如果是七分钟后,再改回当前时间,又会有七分钟校验错误时间。

  在网络上着找到了很多关于这方面校验的资料,总结出几种方法,关于本地和服务端交互:

1. 本地打开计时器,在与服务端校验完成后的七分钟内,都由自己本机去进行时间轮询,每次获取时间不new date,而是直接从计时器中得到当前的时间。

大概实现逻辑:

function beginTimer () {
// 100ms loop once
currentTime += 100; if (timerId) {
clearTimeout(timerId); // clear previous.
} timerId = setTimeout(function () {
beginTimer();
}, 100);
}

优点: 自己开的计时器,不受用户修改本机时间影响。

缺点: 缺点也很明显,setTimeOut 也只是加入到任务的最后,如果有其他任务在排队,它也只能等着,这样就会导致实际时间已经超过100ms,但是只加了100ms,此时获取到的时间就会有偏差,而且随着时间加长,偏差会越来越大,而且这样频繁的打开setTimeOut,说对网页性能完全没有影响,很显然不太现实。

2. 由于多端开发,参照手机端的校验方式是由后台唤醒之后,开始拿取离线消息,同时校验时间,我觉得也可以采用这样的一种方式,当程序被切到当前界面时,可以去与服务端校验一次时间,但PC端毕竟与手机相差很多,可以几秒内进行多次的,切进来,切出去,所以必然要有一种时间或者次数的限制,来避免自身频繁的进行服务器请求(未实现此方式,不贴代码了)

3. 这种方法跟第一种方式很像,但并不是自己开定时器来计算当前时间,而是针对自己修改了时间的用户,在开始new一个时间,然后每30秒,再次new一个时间,判断两个时间的差值,是否在我的预期范围内(误差10s),如果不在,则进行服务校验,这样就能保证用户在修改时间后的一分钟以内,我就能知道本机时间出现了问题,需要我来重新校验了。

大概实现逻辑:

var beginTime;
var timerId;
var defaultInterval = 30000; // check time difference.default: 30s.
var mixTimeDiff = 10000; // local time mix differece is 10s.
var flush = true; // a lock. for prevent timer loops during init Timer. function initTime () {
flush = false;
if (timerId) {
clearTimeout(timerId);
}
beginTime = new Date().getTime();
beginTimer();
} function beginTimer () { let currentTime = new Date().getTime(); if (flush && Math.abs(currentTime - beginTime) > defaultInterval + mixTimeDiff) {
// check serverTime.
console.error('current time is wrong! Recheck the server time.');
} beginTime = currentTime; // reset begin time. if (timerId) {
clearTimeout(timerId); // clear previous.
} flush = true; // release lock. timerId = setTimeout(function () {
if (flush) {
beginTimer();
}
}, defaultInterval);
} module.exports = {
initTime
}

优点:每30进行一次校验,频率并不是很高,对性能影响上也不会很大,同样在30s内就能了解到本地时间是否正常。

缺点:方法有点取巧,并未完全解决用户修改本地时间的问题,在这三十秒内,还是会出现发送时间有误的问题,但是修改时间的需求毕竟是少数,能在30m内纠正好,聊胜于无了。

web端本地与服务端时间校验的更多相关文章

  1. Spring Boot构建的Web项目如何在服务端校验表单输入

    本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...

  2. 在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程

    在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github ...

  3. springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)

    项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖  ...

  4. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  5. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

  6. JSON Web Token (JWT),服务端信息传输安全解决方案。

    JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...

  7. 【Web】CXF WebService 服务端和客户端 环境搭建及测试

    cxf服务端 1.去官方下载对应的jar包:http://cxf.apache.org/ 2.maven配置相应jar包 3.修改web.xml,完成spring和cxf配置 <!-- Spri ...

  8. 3.菜鸟教你一步一步开发 web service 之 axis 服务端创建

    转自:https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步,新建一个工程,如图: 选 Java 写一个工程名,选择好工程路径 ...

  9. SVN 本地文件锁/服务端文件锁清除步骤

    1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选 ...

随机推荐

  1. NB学校的NB课程的NB教材——CSAPP

    CMU是全美以至全球公认的CS最猛的大学之一,没办法,作为CS的发源地,再加上三位神一样的人先后在此任教:Alan Perlis(CS它祖宗+第一届Turing奖获得者).Allen Newell(A ...

  2. Font Awesome,一套绝佳的图标字体库和CSS框架

    http://fontawesome.dashgame.com/ http://www.runoob.com/font-awesome/fontawesome-tutorial.html Font A ...

  3. Django之Orm的各种操作

    1.一般操作 ***必知必会13条*** <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 models.Cu ...

  4. selenium对百度进行登录注销

    #百度登录退出demo import time from selenium import webdriver from selenium.webdriver.common.action_chains ...

  5. inotify+rsync文件实时同步报错:usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0:

    解决办法: ln -sv /usr/local/lib/libinotify* /usr/lib/ /usr/lib64/libinotifytools.so.

  6. loadrunner测试https

    需要要代码前加上:web_set_sockets_option("SSL_VERSION", "TLS");

  7. Fiddler 抓包工具入门

    转自:https://www.cnblogs.com/yyhh/p/5140852.html 序章 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操 ...

  8. scrapy爬取数据保存csv、mysql、mongodb、json

    目录 前言 Items Pipelines 前言 用Scrapy进行数据的保存进行一个常用的方法进行解析 Items item 是我们保存数据的容器,其类似于 python 中的字典.使用 item ...

  9. C#中判断DataReader是否为空的代码

    下面的内容是关于C#中判断DataReader是否为空的内容. if(DataReader.HasRows){}

  10. Linux支持ntfs,exfat格式文件系统

    sudo apt-get install exfat-utilssudo apt-get install ntfs-3g ntfs-config exFAT最高支持16EB的文件,并且exfat在wi ...