【Asp.net】Javascript获取服务器时间与cookie的过期分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ght886/article/details/85553009

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()获取的本地时间并不准确.与服务器相差很大.本地时间可被客户修改.

猜你喜欢

转载自blog.csdn.net/ght886/article/details/85553009
今日推荐