通過原生js的ajax或jquery的ajax獲取服務器的時間


在實際的業務邏輯中,經常是與時間相關的,而前端能獲得的時間有兩個:客戶端的時間,服務器的時間.

客戶端時間通過 javascript中的Date對象可以獲取,如

Java代碼   收藏代碼
  1. var dt = new Date();  
  2. var tm = dt.getTime();  



那么tm就是客戶端的時間,另外也可以通過對應的getFullYear(),getMonth(),getDate()取到對應的年月日等...
但這個時間可靠嗎?

好吧,那取服務器時間吧
經常用到的是后台寫一個php,jsp,cgi,asp...通過這些程序來返回一個時間,這是一種解決方案,但僅僅一個時間點,有必要用程序后台程序來實現嗎?

那還有什么解決方案嗎?
PS:在生成頁面的時候把服務器時間就寫在里邊,然后就可以直接用了.但如果只是一個靜態頁面了呢,能這么干嗎?

好吧,我在這里提出我的解決方案: Ajax HTTP Head

原理:
一般服務器在發送靜態頁面的時候(apache, nginx, lighttpd就目前所知)都是會在 HTTP 頭里帶一個Date的頭信息的,那么我用Ajax直接取頭信息里的Date不就OK了嗎!8) 

PS:但ajax發請求出去不是會有正文返回嗎,那正文的內容比請求一次動態頁面的代價可高多了,是這樣的嗎?8) 

實現:

Java代碼   收藏代碼
  1. var xhr = new XMLHttpRequest();  
  2. if( !xhr ){  
  3.    xhr = new ActiveXObject("Microsoft.XMLHTTP");  
  4. }  
  5. xhr.open("HEAD",location.href,true);  
  6. xhr.onreadystatechange=function(){  
  7.     if( xhr.readyState == 4 && xhr.status == 200 ){  
  8.          alert(xhr.getResponseHeader("Date"));  
  9.     }  
  10. }  
  11. xhr.send(null);  





解釋:
常見的Ajax請求方法為GET,POST而這兩種請求都可能會返回正文體,而發HEAD頭則只會返回對應的頭信息,不會有正文,且只要javascript可以執行,就可以取當前域的地址作為請求地址,有一定的通用性,且避免了跨域的問題.:lol: 


實踐:

以上代碼的完整版在ie6,7,8,9,opera,chrome,firefox下測試通過


適用范圍:

javascript正常執行的作用域是http/https下生效



其他:
服務器一定會返回Date頭信息嗎?
這個是RFC里要求服務器必須實現的,只有在101,103,500等幾個狀態碼的情況下服務器才可以不返回Date頭.但我們的location.href不在這個情況之列,所以只要當前javascript代碼能正常執行(http方式),那么這個時間就可以取得到

定制的服務器不在本文討論范圍之內




轉載請保留以下內容:
author:mooring
sites: http://mooring.iteye.com
date:2012/02/23

 

------------------------------

1. jquery封裝的ajax方法獲取web服務器時間

var t = $.ajax({type:'HEAD', async:'false'}).getResponseHeader('date'); //同步請求

 

2.chrome強烈不建議在主線程發同步的ajax請求,異步的寫法如下:

var t;

$.ajax({type:'HEAD', async: true})

 .success(function(data, status, xhr){

   t=xhr.getResponseHeader('Date');

 });

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM