jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )

Original 2016-11-17 11:50:08 1128
abstract:通过 jQuery 提供的 ajaxSetup 方法,我们可以拦截页面上所有的 Ajax 请求响应(包括 $.ajax、$.post、$.get)。这样我们可以对这些 Ajax 请求响应做统一的处理。比如判断 sesion 是否失效,失效的话就跳转到登录页。下面通过几个样例进行演示。一、判

通过 jQuery 提供的 ajaxSetup 方法,我们可以拦截页面上所有的 Ajax 请求响应(包括 $.ajax、$.post、$.get)。这样我们可以对这些 Ajax 请求响应做统一的处理。比如判断 sesion 是否失效,失效的话就跳转到登录页。下面通过几个样例进行演示。

一、判断session是否失效,并统一进行处理

Ajax 请求数据时,后台代码判断当前 session 是否存在,是否已经超时失效了。如果 session 存在则返回正常数据。如果不存在则不返回正常数据,并在 header 中添加一个 session 超时标记。

页面拦截请求后判断 header 中是否有这个超时标记,如果有的话则提示用户,并跳转到登录页面。

1,样例效果图

(1)先点击“登录”按钮创建 session,再点击“获取数据”按钮则可以成功得到数据。

(2)如果未登录,或者登录后又点击了“注销”按钮。获取数据时后台判断没有 session,则会在 header 中设置一个超时标记。前台页面弹出提示并跳转到登录页。


QQ图片20161117104700.pngQQ图片20161117104749.png

2,样例代码

(1)index.html(主页面)

<html>
  <head>
    <title>hangge.com</title>
    <meta charset="utf-8"/>
    <script type="text/javascript" src="./jquery-1.11.1.min.js"></script>
    <script>
      //全局的ajax访问,处理ajax清求时session超时
      $.ajaxSetup({
         contentType:"application/x-www-form-urlencoded;charset=utf-8",
         complete:function(XMLHttpRequest,textStatus){
             //通过XMLHttpRequest取得响应头,sessionstatus,
             var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");
             if(sessionstatus=="timeout"){
                 //如果超时就处理 ,指定要跳转的页面(比如登陆页)
                 window.location.replace("/login/index.php");
             }
          }
       });
 
      //获取数据
      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()">获取数据</button>
    <button onclick="login(true)">登录</button>
    <button onclick="login(false)">注销</button>
  </body>
</html>

(2)login.php(登录注销)

<?php
//启动session会话
session_start();
 
//处理登录或登出
if($_GET["login"] == "true"){
  $_SESSION['userid'] = 123;
  echo "登录成功!";
}else{
  unset($_SESSION['userid']);
  echo "退出成功!";
}
?>

(3)content.php(获取内容)

<?php
//启动session会话
session_start();
 
//session不存在的话停止返回数据,并在头部标记session失效
if (!isset($_SESSION["userid"])){
  echo "session超时,请重新登录!";
  header("sessionstatus: timeout");
  return;
}
?>
 
这个是测试数据!这个是测试数据!

二、统一处理返回结果

上面的样例是通过 header 中的标记来判断 session 是否超时。我们也可以将超时或是其他异常情况放置在返回结果中,前台统一解析结果来进行各种异常处理。

1,后台返回数据样例

比如后台返回如下格式的 JSON 数据,包括正常情况和异常情况。

//正常数据返回
{"state":1, "msg":"", "data":"欢迎访问hangge.com"}
 
//session超时数据返回
{"state":-1, "msg":"session超时,请重新登录!"}
 
//异常情况数据返回
{"state":0, "msg":"服务器繁忙,请稍后再试。"}

2,前台处理样例

//全局的ajax访问,处理ajax清求时异常
$.ajaxSetup({
   contentType:"application/x-www-form-urlencoded;charset=utf-8",
   complete:function(XMLHttpRequest,textStatus){
      //通过XMLHttpRequest取得响应结果
      var res = XMLHttpRequest.responseText;
      try{
        var jsonData = JSON.parse(res);
        if(jsonData.state == -1){
          //如果超时就处理 ,指定要跳转的页面(比如登陆页)
          alert(jsonData.msg);
          window.location.replace("/login/index.php");
        }else if(jsonData.state == 0){
          //其他的异常情况,给个提示。
          alert(jsonData.msg);
        }else{
          //正常情况就不统一处理了
        }
      }catch(e){
      }
    }
 });
 
//获取数据
function getContent() {
  $.get("content.php", function (data){
      var jsonData = JSON.parse(data);
      //只处理正常的情况
      if(jsonData.state == 1){
        alert(jsonData.data);
      }
   });
}

三、统一处理异常的HTTP状态码

我们还可以通过 Ajax 拦截,根据异常的 HTTP 状态码(404、500等)统一处理各种请求错误、服务器错误等情况。

$.ajaxSetup({
   contentType:"application/x-www-form-urlencoded;charset=utf-8",
   complete:function(XMLHttpRequest,textStatus){
   },
   statusCode: {
     404: function() {
         alert('数据获取/输入失败,没有此服务。404');
     },
     504: function() {
         alert('数据获取/输入失败,服务器没有响应。504');
     },
     500: function() {
         alert('服务器有误。500');
     }
   }
});


Release Notes

Popular Entries