jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )
通过 jQuery 提供的 ajaxSetup 方法,我们可以拦截页面上所有的 Ajax 请求响应(包括 $.ajax、$.post、$.get)。这样我们可以对这些 Ajax 请求响应做统一的处理。比如判断 sesion 是否失效,失效的话就跳转到登录页。下面通过几个样例进行演示。
一、判断session是否失效,并统一进行处理
Ajax 请求数据时,后台代码判断当前 session 是否存在,是否已经超时失效了。如果 session 存在则返回正常数据。如果不存在则不返回正常数据,并在 header 中添加一个 session 超时标记。
页面拦截请求后判断 header 中是否有这个超时标记,如果有的话则提示用户,并跳转到登录页面。
1,样例效果图
(1)先点击“登录”按钮创建 session,再点击“获取数据”按钮则可以成功得到数据。
(2)如果未登录,或者登录后又点击了“注销”按钮。获取数据时后台判断没有 session,则会在 header 中设置一个超时标记。前台页面弹出提示并跳转到登录页。
2,样例代码
(1)index.html(主页面)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <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> |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php //启动session会话 session_start(); //处理登录或登出 if ( $_GET [ "login" ] == "true" ){ $_SESSION [ 'userid' ] = 123; echo "登录成功!" ; } else { unset( $_SESSION [ 'userid' ]); echo "退出成功!" ; } ?> |
(3)content.php(获取内容)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php //启动session会话 session_start(); //session不存在的话停止返回数据,并在头部标记session失效 if (!isset( $_SESSION [ "userid" ])){ echo "session超时,请重新登录!" ; header( "sessionstatus: timeout" ); return ; } ?> 这个是测试数据!这个是测试数据! |
二、统一处理返回结果
上面的样例是通过 header 中的标记来判断 session 是否超时。我们也可以将超时或是其他异常情况放置在返回结果中,前台统一解析结果来进行各种异常处理。1,后台返回数据样例
比如后台返回如下格式的 JSON 数据,包括正常情况和异常情况。
1 2 3 4 5 6 7 8 | //正常数据返回 { "state" :1, "msg" : "" , "data" : "欢迎访问hangge.com" } //session超时数据返回 { "state" :-1, "msg" : "session超时,请重新登录!" } //异常情况数据返回 { "state" :0, "msg" : "服务器繁忙,请稍后再试。" } |
2,前台处理样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | //全局的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等)统一处理各种请求错误、服务器错误等情况。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $.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' ); } } }); |