Javascript获取服务器时间
原理就是这么简单:通过ajax向服务器发送请求,当服务器收到请求后即可读取响应头的时间戳了,不管请求成功或失败,都可以拿到时间戳。
只需要一个ajax请求就搞定,通过读取XMLHttpRequest对象的响应头里面的时间戳得到当前服务器时间!
XMLHttpRequest有5中状态变化:
XMLHttpRequest.readyState值 | 表示的意思 |
0 | 未初始化,已经创建一个XMLHttpRequest对象,但是还没有初始化 |
1 | 未发送,代码已经调用了xmlhttprequest open()方法并且xmlhttprequest已经准备好把一个请求发送到服务器 |
2 | 已发送,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应,可以读取响应头信息了 |
3 | 正在接收,已经接收到http响应头部信息,但是消息体部分还没有完全接收完毕 |
4 | 已加载,响应已经被完全接收 |
//获取服务器时间
ajaxTime();
function ajaxTime(option){
var xhr = null;
var time = null, curDate = null;
if(window.XMLHttpRequest){
xhr = new window.XMLHttpRequest();
}else{ // ie
xhr = new ActiveObject("Microsoft")
}
// 通过get的方式请求当前文件
xhr.open("get","/");
xhr.send(null);
// 监听请求状态变化
xhr.onreadystatechange = function(){
if(xhr.readyState===2){
// 获取响应头里的时间戳
time = xhr.getResponseHeader("Date");
/!*console.log(xhr.getAllResponseHeaders())*!/
curDate = new Date(time);
}
}
//通过监听XMLHttpRequest的readystatechange事件来判断当前处于哪种状态,从表中可以看出,当XMLHttpRequest.readyState值为2时就可以读取响应头拿到我们要的时间戳
cookie的过期分析
曲折的经历:
为了验证上面的代码获取的是服务器时间,本人把计算机时间调整到了2020年。运行上面代码,正确。然后再改回现在的日期2019年。结果获取的服务器时间显示2020-01-01 09:01:06。之后查看HTTPResponse头部Date一直是2020年。而且所有的网站cookies都过期了。
问题描述
W3SVC日志显示错误的时间 - 卡在同一时间2020-01-01 09:01:06
HTTPResponse头部Date一直是 Date: Wed, 01 Jan 2020 01:01:06 GMT。
重现步骤
将系统时间更改为未来时间(例如2021年1月1日)
浏览任何网站 - 验证在新日期/时间创建的日志文件
将系统时间更改为正确(今天的日期和时间)
现在,浏览任何网站,看到日志文件上的时间现在停留在2021年1月1日的时间
解决办法
以管理员身份运行cmd
net stop http
net start http iisreset
每当更改服务器中的日期时,都必须重新启动http服务。
cookie设置的过期时间是以服务器时间为基准,在浏览器得到服务器的任何HTTP响应头后会将浏览器的时间与服务器同步.
而使用new Date()获取的本地时间并不准确.与服务器相差很大.本地时间可被客户修改.