abstract:通過(guò) jQuery 提供的 ajaxSetup 方法,我們可以攔截頁(yè)面上所有的 Ajax 請(qǐng)求響應(yīng)(包括 $.ajax、$.post、$.get)。這樣我們可以對(duì)這些 Ajax 請(qǐng)求響應(yīng)做統(tǒng)一的處理。比如判斷 sesion 是否失效,失效的話就跳轉(zhuǎn)到登錄頁(yè)。下面通過(guò)幾個(gè)樣例進(jìn)行演示。一、判
通過(guò) jQuery 提供的 ajaxSetup 方法,我們可以攔截頁(yè)面上所有的 Ajax 請(qǐng)求響應(yīng)(包括 $.ajax、$.post、$.get)。這樣我們可以對(duì)這些 Ajax 請(qǐng)求響應(yīng)做統(tǒng)一的處理。比如判斷 sesion 是否失效,失效的話就跳轉(zhuǎn)到登錄頁(yè)。下面通過(guò)幾個(gè)樣例進(jìn)行演示。
一、判斷session是否失效,并統(tǒng)一進(jìn)行處理
Ajax 請(qǐng)求數(shù)據(jù)時(shí),后臺(tái)代碼判斷當(dāng)前 session 是否存在,是否已經(jīng)超時(shí)失效了。如果 session 存在則返回正常數(shù)據(jù)。如果不存在則不返回正常數(shù)據(jù),并在 header 中添加一個(gè) session 超時(shí)標(biāo)記。
頁(yè)面攔截請(qǐng)求后判斷 header 中是否有這個(gè)超時(shí)標(biāo)記,如果有的話則提示用戶,并跳轉(zhuǎn)到登錄頁(yè)面。
1,樣例效果圖
(1)先點(diǎn)擊“登錄”按鈕創(chuàng)建 session,再點(diǎn)擊“獲取數(shù)據(jù)”按鈕則可以成功得到數(shù)據(jù)。
(2)如果未登錄,或者登錄后又點(diǎn)擊了“注銷”按鈕。獲取數(shù)據(jù)時(shí)后臺(tái)判斷沒(méi)有 session,則會(huì)在 header 中設(shè)置一個(gè)超時(shí)標(biāo)記。前臺(tái)頁(yè)面彈出提示并跳轉(zhuǎn)到登錄頁(yè)。
2,樣例代碼
(1)index.html(主頁(yè)面)
<html> <head> <title>hangge.com</title> <meta charset="utf-8"/> <script type="text/javascript" src="./jquery-1.11.1.min.js"></script> <script> //全局的ajax訪問(wèn),處理ajax清求時(shí)session超時(shí) $.ajaxSetup({ contentType:"application/x-www-form-urlencoded;charset=utf-8", complete:function(XMLHttpRequest,textStatus){ //通過(guò)XMLHttpRequest取得響應(yīng)頭,sessionstatus, var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); if(sessionstatus=="timeout"){ //如果超時(shí)就處理 ,指定要跳轉(zhuǎn)的頁(yè)面(比如登陸頁(yè)) window.location.replace("/login/index.php"); } } }); //獲取數(shù)據(jù) function getContent() { $.get("content.php", function (data){ alert(data); }); } //登錄或注銷 function login(value) { $.get("login.php",{"login":value} , function (data){ alert(data); }); } </script> </head> <body> <button onclick="getContent()">獲取數(shù)據(jù)</button> <button onclick="login(true)">登錄</button> <button onclick="login(false)">注銷</button> </body> </html>
(2)login.php(登錄注銷)
<?php //啟動(dòng)session會(huì)話 session_start(); //處理登錄或登出 if($_GET["login"] == "true"){ $_SESSION['userid'] = 123; echo "登錄成功!"; }else{ unset($_SESSION['userid']); echo "退出成功!"; } ?>
(3)content.php(獲取內(nèi)容)
<?php //啟動(dòng)session會(huì)話 session_start(); //session不存在的話停止返回?cái)?shù)據(jù),并在頭部標(biāo)記session失效 if (!isset($_SESSION["userid"])){ echo "session超時(shí),請(qǐng)重新登錄!"; header("sessionstatus: timeout"); return; } ?> 這個(gè)是測(cè)試數(shù)據(jù)!這個(gè)是測(cè)試數(shù)據(jù)!
二、統(tǒng)一處理返回結(jié)果
上面的樣例是通過(guò) header 中的標(biāo)記來(lái)判斷 session 是否超時(shí)。我們也可以將超時(shí)或是其他異常情況放置在返回結(jié)果中,前臺(tái)統(tǒng)一解析結(jié)果來(lái)進(jìn)行各種異常處理。
1,后臺(tái)返回?cái)?shù)據(jù)樣例
比如后臺(tái)返回如下格式的 JSON 數(shù)據(jù),包括正常情況和異常情況。
//正常數(shù)據(jù)返回 {"state":1, "msg":"", "data":"歡迎訪問(wèn)hangge.com"} //session超時(shí)數(shù)據(jù)返回 {"state":-1, "msg":"session超時(shí),請(qǐng)重新登錄!"} //異常情況數(shù)據(jù)返回 {"state":0, "msg":"服務(wù)器繁忙,請(qǐng)稍后再試。"}
2,前臺(tái)處理樣例
//全局的ajax訪問(wèn),處理ajax清求時(shí)異常 $.ajaxSetup({ contentType:"application/x-www-form-urlencoded;charset=utf-8", complete:function(XMLHttpRequest,textStatus){ //通過(guò)XMLHttpRequest取得響應(yīng)結(jié)果 var res = XMLHttpRequest.responseText; try{ var jsonData = JSON.parse(res); if(jsonData.state == -1){ //如果超時(shí)就處理 ,指定要跳轉(zhuǎn)的頁(yè)面(比如登陸頁(yè)) alert(jsonData.msg); window.location.replace("/login/index.php"); }else if(jsonData.state == 0){ //其他的異常情況,給個(gè)提示。 alert(jsonData.msg); }else{ //正常情況就不統(tǒng)一處理了 } }catch(e){ } } }); //獲取數(shù)據(jù) function getContent() { $.get("content.php", function (data){ var jsonData = JSON.parse(data); //只處理正常的情況 if(jsonData.state == 1){ alert(jsonData.data); } }); }
三、統(tǒng)一處理異常的HTTP狀態(tài)碼
我們還可以通過(guò) Ajax 攔截,根據(jù)異常的 HTTP 狀態(tài)碼(404、500等)統(tǒng)一處理各種請(qǐng)求錯(cuò)誤、服務(wù)器錯(cuò)誤等情況。
$.ajaxSetup({ contentType:"application/x-www-form-urlencoded;charset=utf-8", complete:function(XMLHttpRequest,textStatus){ }, statusCode: { 404: function() { alert('數(shù)據(jù)獲取/輸入失敗,沒(méi)有此服務(wù)。404'); }, 504: function() { alert('數(shù)據(jù)獲取/輸入失敗,服務(wù)器沒(méi)有響應(yīng)。504'); }, 500: function() { alert('服務(wù)器有誤。500'); } } });