前端要以服务器的时间为准,有啥好用的库吗?

2021-03-24 12:10:48 +08:00
 vinsony

场景是大量客户端电脑时间都不准,也没有时间同步,只能在程序里请求后端时间接口获取真实时间。

现在想法是程序只取一次服务器时间,然后在客户端模拟一个时间出来,关键要能支持 new Date 获取这个模拟时间,而且这个模拟时间能一直自动继续走。

这样的需求有啥好用的库吗?

8035 次点击
所在节点    JavaScript
46 条回复
geekvcn
2021-03-24 19:58:36 +08:00
https://github.com/enmasseio/timesyn
找到一个现成的库,不知道性能如何还没细看
geekvcn
2021-03-24 19:59:50 +08:00
还是传统的 websocket,应该轮询实现的
ligolas
2021-03-24 20:01:59 +08:00
@Hoshinokozo 通信时间就用本地计时的差值就可以,至于精度,可以根据需求来呗,他的核心需求是客户端时间不准是因为没开 ntp 对时,所以估计是差异很大,需求可能只是要求一个跟服务器尽量统一的时间,如果精度要求不高,可以就用 Date 的差值其实也就可以了。如果需要精度高一些的,可以用 performance.now()
xuanbg
2021-03-24 20:30:51 +08:00
服务端渲染
agdhole
2021-03-24 20:48:18 +08:00
很多网站都禁止时间不准的电脑访问,例如 y2b
autoxbc
2021-03-24 20:50:43 +08:00
@ligolas #10 自己的服务器,自己的前端,不需要 CORS 就可以读 headers
sxlzll
2021-03-24 22:26:55 +08:00
电脑时钟总是准的,存个基准时间比较差值呗
indev
2021-03-25 01:02:06 +08:00
像 firebase 都会返回统一的服务器时间戳
lmaq
2021-03-25 07:16:35 +08:00
ShinichiYao
2021-03-25 08:25:04 +08:00
@agdhole 那以后移民火星的看不了片子了
CEBBCAT
2021-03-25 08:42:53 +08:00
@ShinichiYao 时延和时间准确不一样哦。
@agdhole 说的应该是连接到 HTTPS 网站时加密通信失败带来的打不开
yl20181003
2021-03-25 08:59:28 +08:00
响应头上去取就可以了,后端配置下即可
yazoox
2021-03-25 10:25:21 +08:00
@lmaq
这个是直接发一个 http GET 请求就可以了?然后在返回的结果里面把 data.t 取出来?
```
{"api":"mtop.common.getTimestamp","v":"*","ret":["SUCCESS::接口调用成功"],"data":{"t":"1616639029711"}}
```
ligolas
2021-03-25 10:44:52 +08:00
@autoxbc 自己的前端是什么概念? cors 是浏览器端的机制,只要用户还在使用正常的,版本不是特别老的浏览器,读取 header 就必须遵守 CORS,你自己尝试一下不难
yazoox
2021-03-25 10:46:44 +08:00
@lmaq
试了一下,用 postman 客户端,http GET 可以成功。
但是,用 postwoman,在线版 /PWA 版本,都是 404 。 奇怪, 我已经用 CORS 插件禁止了呢。
```
Referrer Policy: strict-origin-when-cross-origin
```
Yunen
2021-03-25 13:57:52 +08:00
@ShinichiYao 你放心,等你移民火星的时候,火星上的互联网公司估计早都建好机房了 XD
xingguang
2021-03-25 16:28:12 +08:00
是不是可以换个思路,让后端来做时间之类的东西,既然要服务器的时间,那么让后端接受到接口的时候自己建立时间对象
autoxbc
2021-03-25 19:57:57 +08:00
@ligolas #34 CORS 是 Cross-origin resource sharing,这里根本就不 Cross-origin,不受这个限制
ligolas
2021-03-25 21:43:55 +08:00
@autoxbc 我确定你没搞懂 CORS 里面的 Cross-Origin 指的什么场景,到底哪里会 Cross Origin,为什么要做这个限制。
https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header,注意这篇文章的标题:CORS-safelisted_response_header,点开链接看一下,然后再好好理解下 CORS 的本质。
autoxbc
2021-03-25 22:35:42 +08:00
@ligolas #39 我读了文章,试着理解一下

1. 当 A 站 的前端跨域访问 B 站的页面时,因为同源限制,读取的内容会被浏览器抛弃掉;
2. 此时,如果 B 站的后端确认这些内容不是用户的机密,可以配置一个 CORS 标志,使得 A 站的前端可以读取这个内容;
3. 文章说的是,即便配置了 CORS 标志,有些消息头仍然没有全部暴露给 A 站,这个过程会经历一个过滤器;
4. 这个过滤器默认放行文章所述的 6 种消息头;以及,这个放行策略可以由 B 站进行扩充

那么,回到问题,题主现在是 A 站的前端,需要从 A 站的响应里读取消息头,整个过程不需要跨域,所以不需要配置 CORS,自然更不需要管理 CORS-safelisted_response_header

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX