国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

WEX5中ajax跨域訪問的幾種方式

2019-11-15 00:49:06
字體:
來源:轉載
供稿:網友
WEX5中Ajax跨域訪問的幾種方式

1、使用jsonp方式

使用jsonp訪問的話,前端需要把回調函數名傳遞給后端,后端執行完后也需要把回調函數傳回給前端,默認情況下ajax自動生成一個回調函數名,后端可以通過String callback = request.getParameter("callback"); 得到這個回調函數名

前端示范代碼:

 1 $.ajax({ 2     "type" : "post", 3     "dataType" : "jsonp", 4     "async" : false, 5     "url" : "http://192.168.0.24:8080/WaterMIS_App/data", 6     "data" : { 7         "action" : "checkAddress", 8     }, 9     "success" : function(xhr) {10         alert("成功!")11     }12 });

后端示范代碼:

 1 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { 2     //請求 3     String action  = request.getParameter("action"); 4     //回調函數名 5     String callback = request.getParameter("callback");   6     //控制器部分 7     if("checkAddress".equals(action)){ 8         response.setContentType("text/html;charset=utf-8"); 9         response.getWriter().write(callback+"({});");    10     }11 }

后端響應必須以functionName(JSON字符串);這樣的字符串返回給前端。

改進:

jsonp類型的請求是只能異步的,而且請求失敗也不會有任何的提示,因此我的解決辦法是使用setTimeout推遲成功回調函數的執行,通過設置flag判斷是否已經執行了成功回調而判斷是否執行失敗代碼

前端示范代碼改進:

 1 var flag = 1; //是否已經執行過回調函數 1為初始值 2為執行過 0為響應失敗 2 var time = 1000;//時間設置 單位.毫秒 3 $.ajax({ 4     "timeout" : time, 5     "type" : "post", 6     "dataType" : "jsonp", 7     "async" : false, 8     "url" :  "http://192.168.0.24:8080/WaterMIS_App/data", 9     "data" : {10         "action" : "checkAddress",11     },12     "success" : function(xhr) {13         flag = 2;14         alert("成功!");15     }16 });17     18 //請求失敗  把方法設置為time毫秒之后執行 假如flag不為2 則在時間范圍內成功回調沒有執行,則認為請求失敗19 setTimeout(function() { 20     if (flag!=2) {21         flag = 0;22         alert("失?。?);23     }24 }, time+1); 25     26 //請求超時 當時間為time+2 flag還為初始時候的值1 則認為成功回調跟請求失敗都沒執行,則認為請求超時27 setTimeout(function(xhr) { 28     if (flag==1) {29         alert("超時");30     }31 }, time+2); 

2、設置響應頭的方式進行跨域請求

通過設置響應頭,達到跟普通ajax請求一樣的效果

前端示范代碼:

 1 $.ajax({ 2     "type" : "post", 3     "async" : false, 4     "dataType" : "json", 5     "url" : "http://192.168.0.24:8080/WaterMIS_App/data", 6     "data" : { 7         "action" : "checkAddress", 8     }, 9     "complete" : function(xhr) {10         if (xhr.readyState == 4 && xhr.status == 200) {11             alert("成功!");12         } else {13             alert("失??!");14         }15     }16 });

后端代碼示范:

 1 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { 2     //請求 3     String action  = request.getParameter("action"); 4  5     //控制器部分 6     if("checkAddress".equals(action)){ 7         response.setContentType("text/html;charset=utf-8"); 8         ((HttpServletResponse)response).addHeader("access-Control-Allow-Origin", "*"); 9         response.getWriter().write("{}");    10     }11 }

備注:

第一種方法得到的json數據是自動解析成json對象的,能直接對json對象的操作

第二種方法得到的僅僅只是一個字符串,假如是一個json格式的字符串,可以通過eval()或者JSON.parse()進行轉換,另外需要注意響應頭再一次請求中只能被設置一次,多次設置會導致出錯。最好是在過濾器中進行設置。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广丰县| 鞍山市| 永州市| 安陆市| 岚皋县| 康定县| 永胜县| 元朗区| 石家庄市| 翁源县| 安多县| 舒兰市| 杭锦后旗| 玛沁县| 杭锦后旗| 陆河县| 张掖市| 新宾| 治多县| 吐鲁番市| 西盟| 靖江市| 西藏| 富阳市| 深圳市| 桂平市| 彭州市| 九台市| 南通市| 丹江口市| 宜良县| 康马县| 扎囊县| 韶山市| 常德市| 额济纳旗| 万盛区| 仁布县| 龙游县| 南川市| 错那县|