ajax怎么会突然出现401,当jquery ajax遇上401请求
jquery ajax是個很常用接口,而在請求時候,可能存在響應401的情況(身份認證過期或未登錄),比較容易出現在混合應用上,如何進行身份認證,重發失敗請求,還是值得注意的。
ajax請求有兩種方式
1. 回調
最常寫的方式,成功失敗處理以回調方式傳入。
$.ajax({
ajax參數...
success : xxxxxx
error: xxxxxx
});
2. Deferred方式
Deferred模式我在《js異步編程》有說明, ajax調用本身返回就是一個Deferred對象,成功失敗回調不以參數傳入。
$.ajax({
ajax參數...
}).then(function(res){
//成功處理片段
},function(err){
//失敗處理片段
});
既然有這兩種方式,那應對處理401的方式也是有兩種。
401處理的兩種方式
1. 回調
這種方式的處理比較簡單,在失敗回調里面判斷401,如果是則進行身份認證,成功重發請求。
function getXXXX(type, url, data, success, error){
$.ajax({
ajax參數...
success : xxxxxx
error : function(xhr,textStatus,errorThrown){
if (xhr.status == 401) {
刷新身份認證方法(function(){
getXXXX(type, url, data, success, error);
});
} else{
// 調用外部的error
error && error(xhr,textStatus,errorThrown);
}
}
});
}
2.?Deferred方式
這種方式目前我找到的處理方式需要修改jquery源碼。
//全局設置一個方法
$.ajaxSetup({
authError : function(callback){
刷新身份認證方法( function(){
callback && callback();
});
}
});
//jquery2.1.4版本源碼,大概是8261行
// Success/Error
if ( isSuccess ) {
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
} else {
if(( jqXHR.status == 401 || jqXHR .status == 403) && callbackContext.authError){
callbackContext.authError(function (){
state = 0;
jqXHR.setRequestHeader( "Authorization", XXXXXX);
jqXHR.readyState = 1;
try {
state = 1;
transport.send( requestHeaders, done );
} catch ( e ) {
// Propagate exception as error if not done
if ( state < 2 ) {
done( -1, e );
// Simply rethrow otherwise
} else {
throw e;
}
}
});
return;
} else {
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
}
}
這里說下為什么不能像第一種方式那樣進行請求。
有兩個原因:
1. then這種鏈式寫法,導致這請求的回調不是在參數里,而是在jQuery.Callbacks一個optionsCache全局變量里,我們無法在ajax error里拿到回調函數進行重發。
2. 寫在then里的回調觸發一次就會被銷毀,當觸發了error時,回調執行后就銷毀。
最后的處理方式就是在要觸發error之前,攔截401的錯誤,重新進行身份認證,然后重置狀態,重發請求。
本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。
jQuery.ajax( options ) : 通過 HTTP 請求加載遠程數據
jQuery.ajax( options ) : 通過 HTTP 請求加載遠程數據 這個是jQuery 的底層 AJAX 實現.簡單易用的高層實現見 $.get, $.post 等. $.ajax() ...
用JQuery Ajax 與一般處理程序 請求數據無刷新,以及如何調試錯誤
通過 ajax() 與 一般處理程序,請求數據庫數據,實現界面無刷新. Jquery ajax 請求參數詳細說明?http://www.w3school.com.cn/jquery/ajax_ajax ...
簡單的jquery ajax文件上傳功能
/* * 圖片上傳 * 注意如果不加processData:false和contentType:false會報錯 */ function uploadImage(image) { var imageF ...
兼容ie的jquery ajax文件上傳
Ajax文件上傳插件很多,但兼容性各不一樣,許多是對ie不兼容的,另外項目中是要求將網頁內容嵌入到桌面端應用的,這樣就不允許帶flash的上傳插件了,如:jquery uploadify...悲劇 對 ...
ASP.NET 異步Web API + jQuery Ajax 文件上傳代碼小析
該示例中實際上應用了 jquery ajax(web client) + async web api 雙異步. jquery ajax post $.ajax({ type: "POST&q ...
struts2+jquery+ajax實現上傳&;&;校驗實例
一直以為ajax不能做上傳,直到最近看了一些文章.需要引入AjaxFileUploaderV2.1.zip,下載鏈接:http://pan.baidu.com/s/1i3L7I2T 代碼和相關配置如下 ...
jQuery ajax中的get請求方法匯總
$.get() Defination and Usage 從服務端以HTTP GET方式獲取數據 Examples 請求test.php,但是忽略返回的數據 $.get("test.php& ...
Struts2 使用Jquery+ajax 文件上傳
話不多說 直接上代碼 前臺js: var formData = new FormData(); formData.append("file1",$("#file1&quo ...
jQuery選擇器遇上一些特殊字符
學習jQuery過程中,發現一些特殊字符,如“.”,“#”,"(","]"等.它在選擇器應用時,按照普通處理就會出錯.解決辦法,就是使用轉義字符來處理,這有點象 ...
隨機推薦
u-boot 流程分析
u-boot 介紹: 對于計算機來說 , 從一開始上機通電是無法直接啟動操作系統的 , 這中間需要一個引導過程 , 嵌入式Linux系統同樣離不開引導程序 ,? 這個啟動程序就叫啟動加載程序(Boot ...
c# 獲取 webbrowser 完整 cookie
下面的代碼實現的功能確實如標題所言,但要求是獲取的是當前進程內的webbrowser,跨進程或引用的ShellWindows對象無效, 哎我本來兩種情況都要用,只把前者代碼先記下: internal ...
POJ C程序設計進階 編程題#1:尋找下標
編程題#1:尋找下標 來源: POJ?(Coursera聲明:在POJ上完成的習題將不會計入Coursera的最后成績.) 注意: 總時間限制: 1000ms 內存限制: 65536kB 描述 已知一 ...
蘋果開發——App內購以及驗證store的收據(二)
原地址:http://zengwu3915.blog.163.com/blog/static/2783489720137605156966?suggestedreading 三. 客戶端使用Store ...
Struts2文件下載淺析
Struts2極大的簡化了文件上傳和下載,本文將主要介紹一下Struts2文件下載的實現1.功能主要是,在下載頁面點擊下載后,則下載相應的文件 2.代碼部分jsp頁面downloadPage:< ...
Jar包轉成Dll的方式(帶嵌套的jar也能做) (轉)
研究很好幾天,終于成功了.因為寫了一個Java的項目,現在要求要改寫成C#版本的.但是其中用到了svnkit,svnkit是java平臺的.改寫成C#的話,要使用SharpSVN,但是SharpSVN ...
mysql 打開sql日志,記錄所有sql
我使用的mysql版本為:5.7.11 win7環境 記錄下下載地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默認沒有開啟sq ...
MySQL 快速復數據庫的方法
為了方便快速復制一個數據庫,可以用以下命令將db1數據庫的數據以及表結構復制到newdb數據庫 創建新的數據庫 #mysql -u root -p123456 mysql>CREATE DATA ...
什么是XML RPC?
# -*- coding: cp936 -*- #python 27 #xiaodeng #什么是XML RPC? #中文叫:遠程過程調用 #使用http協議做傳輸協議的rpc機制,使用xml文本的方 ...
總結
以上是生活随笔為你收集整理的ajax怎么会突然出现401,当jquery ajax遇上401请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有限元是什么?
- 下一篇: 【ARM基础概念:ARMv7架构,ARM