当前校验逻辑: 本地和服务端的时间校验绑定在一个通用请求上,这个请求每七分钟会到服务端请求一次,本地拿到服务器时间后,计算请求服务器来回的时间,最后得出与服务器时间的差值,然后每次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. 数据库入门-pymysql模块的使用

    一.pymysql模块安装 由于本人的Python版本为python3.7,所以用pymysql来连接数据库(mysqldb不支持python3.x) 方法一: #在cmd输入 pip3 instal ...

  2. asp.net core 发布到iis session无法传递的问题

    网站是用asp.net core 的Razor Pages开发的,其中用户登录用到了session,调试运行没有问题,但是发布到iis之后出现session无法记录的问题. 我用log记录查看了一下, ...

  3. Spring出现事务代理的原因

    JdbcTemplate 在配置事务代理之前,JdbcTemplate 的关闭策略,就是操作完立刻关闭!意味着,默认情况是JdbcTemplate操作是不支持事务的!!! 但是我们的程序是需要支持事务 ...

  4. jmeter beanshell遍历接口返回的json数组

    import java.util.LinkedHashMap; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Pred ...

  5. 使用Set集合对List集合进行去重

    /** * 使用Set集合对List集合进行去重 **/ public class SetTest { /** * List集合的泛型为Integer类型 * * @author hongwei.li ...

  6. 浅析微信小程序技术架构(原创)

    周末万里虎抽空体验了下微信小程序的DEMO,对小程序的开发有了一个基础的了解与认识,今天就来和大家分享一下我对小程序的看法. 从官方DEMO来看,小程序在技术架构上非常清晰易懂.JS负责业务逻辑的实现 ...

  7. macOS10.13.2配置TensorFlow

    安装Python python3是通过Homebrew安装的,默认安装的是3.7.0版本,但TensorFlow目前只能在3.4,3.5,3.6上安装,因此首先需要安装3.6版本的python. 首先 ...

  8. 实现upnp ssdp来查找局域网内的其他节点

    upnp协议常用于一些智能家居产品中,这些产品连上家里局域网后,用同样连入家中局域网的手机就能很快检测到此产品了.在区块链技术中,upnp也被应用于寻找同一局域网内的其他节点. 关于upnp的具体描述 ...

  9. docker异常问题解决

    解决方法: 发现这个问题出现的时候,并不是所有的docker都会出现,只影响某个docker 停下:docker stop app-6019-bonus 再起来:docker start app-60 ...

  10. 027 storm面试小题

    1.大纲 Storm工作原理是什么? 流的模式是什么?默认是什么? 对于mapreduce如何理解? Storm的特点和特性是什么? Storm组件有哪些? 2.Storm工作原理是什么? 相对于ha ...