標籤:c class java tar http a
在實際的商務邏輯中,經常是與時間相關的,而前端能獲得的時間有兩個:用戶端的時間,伺服器的時間.
用戶端時間通過 javascript中的Date對象可以擷取,如
Java代碼
- var dt = new Date();
- 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代碼
- var xhr = new XMLHttpRequest();
- if( !xhr ){
- xhr = new ActiveXObject("Microsoft.XMLHTTP");
- }
- xhr.open("HEAD",location.href,true);
- xhr.onreadystatechange=function(){
- if( xhr.readyState == 4 && xhr.status == 200 ){
- alert(xhr.getResponseHeader("Date"));
- }
- }
- 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
------------------------------
jquery封裝的ajax方法擷取web伺服器時間
var t = $.ajax({type:‘HEAD‘, async:‘false‘}).getResponseHeader(‘date‘);