亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

ajax前臺后臺跨域請求處理方式

2024-09-01 08:33:57
字體:
來源:轉載
供稿:網友

最近一直在搞公眾號前臺開發,遇到了ajax跨域請求的問題,像地區的省-市-縣三級聯動、汽車品牌-車系-車款的三級聯動查詢等都需要調用外部接口(其他工程項目的接口)完成。下面就分享一下個人解決跨域請求的方案,當然是在后臺程序猿大哥的幫助下,我才弄明白了其中的淵源,趕緊記錄下來慢慢積累,也希望對大家能有所幫助,還請積極提出意見或建議。

跨域請求需要借助后臺代碼接收callback回調函數,對json數據進行進一步處理;前臺再用ajax請求向服務器發送callback參數,并指定數據格式為jsonp。

一、后臺對跨域請求進行處理

1.CarBrandController.java(汽車品牌接口java文件),這里列出的方法主要用來根據不同的level值查詢對應的品牌、車系、車款,在這里對跨域請求做一個接收回調函數的處理,如果返回的callback為null,則不是跨域請求,不需要做特殊處理,直接打印json接口數據即可;如果返回的callback不為null,則表示跨域請求,這時要對json數據做一個特殊處理,即在json數據的外層加一對小括號包起來,具體請看HttpAdapter.java文件中的printlnJSONObject方法。

public void json(HttpServletRequest request,HttpServletResponse response){   Map<String,Object>map=new HashMap<String, Object>();   String id = request.getParameter("id");      //接收ajax請求帶過來的id   String level = request.getParameter("level");   //接收ajax請求帶過來的level   String callback=request.getParameter("callback"); //接收ajax請求帶過來的callback參數   if ("1".equals(level)) {             //如果level是'1',則查詢第一級目錄內容     map.put("results", this.carBrandService.findByAttr(null, "first_letter asc")); //調用查詢方法,結果放入map   } else if ("2".equals(level)) {          //如果level是'2',則查詢第二級目錄內容     map.put("results", this.carSerieService.findByAttr("parent_id="+id, "first_letter asc"));//調用查詢方法,結果放入map   } else if ("3".equals(level)) {          //如果level是'3',則查詢第三極目錄內容     map.put("results", this.carModelYearService.findByAttr("parent_id="+id, "jian_pin desc"));//調用查詢方法,結果放入map   }   map.put("level",level);   if (null==callback) {               //如果接收的callback值為null,則是不跨域的請求,輸出json對象     HttpAdapter.printlnObject(response, map);   }else{                      //如果接收的callback值不為null,則是跨域請求,輸出跨域的json對象   HttpAdapter.printlnJSONPObject(response, map, callback);   } } 

2.HttpAdapter.java(輸出對象的java文件),printlnObject方法打印正常json字符串;printlnJSONObject方法對json字符串進行了特殊處理。

/**  * 打印對象  * @param response  * @param object */ public static void printlnObject(HttpServletResponse response,Object object){   PrintWriter writer=getWriter(response);   writer.println(JSON.toJSONString(object)); } /**  * 打印跨域對象  * @param response  * @param object */ public static void printlnJSONPObject(HttpServletResponse response,Object object,String callback){   PrintWriter writer=getWriter(response);   writer.println(callback+"("+JSON.toJSONString(object)+")"); } 

二、前臺ajax跨域請求數據

寫法1:向服務器發送一個參數callback=?,同時指定dataType為'jsonp'的格式,跨域請求時指定的數據格式必須是jsonp的形式。

function loadData(obj,level,id,value){   $.ajax({      url:'http://192.168.1.106:8086/carBrand/json.html?level='+level+'&id='+id+'&callback=?',   //將callback寫在請求url后面作為參數攜帶     type:'GET',     async:false,     dataType:'jsonp',     success:function(data){               console.log(data);                   //其他處理(動態添加數據元素)         });    }   

寫法2:callback不需要寫在url中,但是要指定jsonp參數為'callback',并給jsonpCallback參數一個值。

function loadData(obj,level,id,value){   $.ajax({      url:'http://192.168.1.106:8086/carBrand/json.html?level='+level+'&id='+id,     type:'GET',     dataType:'jsonp',     jsonp: 'callback',          //將callback寫在jsonp里作為參數連同請求一起發送     jsonpCallback:'jsonpCallback1',        success:function(data){                console.log(data);       }); }

以上兩種寫法的含義是一樣的,只是寫法不同罷了。

接下來補充一下jsonp的工作原理。

三、jsonp跨域的原理解析

jsonp的最基本的原理是:動態添加一個<script>標簽,而script標簽的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協議無關了.

JSONP是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、端口)的資源。如果要進行跨域請求,我們可以通過使用html的script標記來進行跨域請求,并在響應中返回要執行的script代碼,其中可以直接使用JSON傳遞javascript對象。這種跨域的通訊方式稱為JSONP。

jsonCallback 函數jsonp1236827957501(....): 是瀏覽器客戶端注冊的,獲取跨域服務器上的json數據后,回調的函數

Jsonp原理:

首先在客戶端注冊一個callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)傳給服務器。注意:服務端得到callback的數值后,要用jsonp1236827957501(......)把將要輸出的json內容包括起來,此時,服務器生成 json 數據才能被客戶端正確接收。

然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 'jsoncallback'的值 jsonp1236827957501 .

最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時javascript文檔數據,作為參數,
傳入到了客戶端預先定義好的 callback 函數(如上例中jquery $.ajax()方法封裝的的success: function (json))里.(動態執行回調函數)

可以說jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的(qq空間就是大量采用這種方式來實現跨域數據交換的) .JSONP是一種腳本注入(Script Injection)行為,所以也有一定的安全隱患.

注意,jquey是不支持post方式跨域的.


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区直播精品电影| 日韩欧美999| 爽爽爽爽爽爽爽成人免费观看| 91福利视频网| 日本sm极度另类视频| 91久久久久久久久久久久久| 91老司机精品视频| 日韩免费视频在线观看| 九九九久久国产免费| 成人激情视频免费在线| 久久久免费观看| 久久伊人精品一区二区三区| 日韩欧美主播在线| 国产综合在线视频| 91久久精品国产91久久性色| 一区二区三区精品99久久| 97在线免费视频| 久久99精品久久久久久青青91| 国产不卡视频在线| 91久久夜色精品国产网站| 亚洲人成77777在线观看网| 国产精品视频网| 91av在线精品| 精品国产户外野外| 狠狠色噜噜狠狠狠狠97| 91sa在线看| 国产精品手机播放| 国产精品pans私拍| 午夜美女久久久久爽久久| 国产欧美一区二区三区久久人妖| 国产精品日韩在线一区| 在线播放国产一区二区三区| 国内精品国产三级国产在线专| 国产精品va在线播放我和闺蜜| 亚洲免费电影在线观看| 久久综合国产精品台湾中文娱乐网| 国产免费观看久久黄| 国产视频综合在线| 欧美日韩免费看| 亚洲综合精品一区二区| 色妞一区二区三区| 国产成人一区二| 裸体女人亚洲精品一区| xxx欧美精品| 国产精品一区二区三| 国内精品久久久久影院优| 精品中文字幕在线2019| 欧美日韩在线免费| 九九久久久久久久久激情| 国产成+人+综合+亚洲欧美丁香花| 久久久久北条麻妃免费看| 久久精品国产久精国产思思| 青青久久av北条麻妃海外网| 日韩亚洲一区二区| 亚洲国产欧美一区二区丝袜黑人| 日韩高清av一区二区三区| 国产精品人成电影| 国产欧美精品日韩精品| 亚洲欧美日本另类| 岛国av一区二区在线在线观看| 尤物yw午夜国产精品视频明星| 日韩视频亚洲视频| 日韩在线播放一区| www.日韩av.com| 国产精品三级在线| 日产精品99久久久久久| 九九热精品视频| 亚洲国产精品999| 国产综合香蕉五月婷在线| 久青草国产97香蕉在线视频| 欧美黑人狂野猛交老妇| 97视频在线观看免费高清完整版在线观看| 91久久国产综合久久91精品网站| 孩xxxx性bbbb欧美| 国产精品白嫩初高中害羞小美女| 欧美成在线视频| 亚洲欧美制服第一页| 亚洲欧美日韩在线一区| 成人免费视频网| 亚洲精品国产拍免费91在线| 另类图片亚洲另类| 久久91超碰青草是什么| 久久久精品网站| 国产欧美日韩丝袜精品一区| 爽爽爽爽爽爽爽成人免费观看| 久久久久久网址| 亚洲视频视频在线| 在线丨暗呦小u女国产精品| 久久久av亚洲男天堂| 亚洲欧美日韩区| 欧美性猛交xxxx黑人猛交| 91久久久国产精品| 欧美视频一区二区三区…| 一区二区三区日韩在线| 日韩国产欧美精品在线| 在线视频一区二区| 亚洲成年人在线播放| 久久国产精品久久久| 91夜夜未满十八勿入爽爽影院| 欧美视频在线看| 中文字幕日韩欧美| 亚洲国产成人精品久久| 亚洲欧洲在线看| 国产美女主播一区| 欧美性理论片在线观看片免费| 欧美日韩久久久久| 国产mv久久久| 色在人av网站天堂精品| 亚洲精品资源美女情侣酒店| 日韩av影视综合网| 国产精品白丝jk喷水视频一区| 亚洲精品aⅴ中文字幕乱码| 欧美夫妻性生活xx| 日韩一区二区久久久| 亚洲片在线观看| 在线亚洲国产精品网| 超碰91人人草人人干| 久久国产精彩视频| 国产精品极品尤物在线观看| 亚洲人成网7777777国产| 97香蕉超级碰碰久久免费软件| 日韩视频免费在线观看| 日韩欧美有码在线| 91麻豆国产语对白在线观看| 久久露脸国产精品| 在线精品视频视频中文字幕| 亚洲天堂av图片| 国产精品va在线| 亚洲人午夜精品| 日韩av理论片| 国产精品久久久久久五月尺| 久久久久久久一区二区| 久久九九亚洲综合| 欧美激情va永久在线播放| 伊人久久免费视频| 日本19禁啪啪免费观看www| 在线色欧美三级视频| 亚洲国产成人精品久久久国产成人一区| 精品国内自产拍在线观看| 久久av.com| 日本亚洲欧美三级| 欧美电影免费观看电视剧大全| 欧美性猛交xxxx富婆弯腰| 日韩视频一区在线| 久久av在线播放| 欧美日韩一区二区免费在线观看| 日韩最新在线视频| 97精品一区二区视频在线观看| 久久精视频免费在线久久完整在线看| 在线中文字幕日韩| 久久99久久99精品免观看粉嫩| 亚洲成人1234| 欧美高清在线播放| 国产日韩欧美另类| 色婷婷亚洲mv天堂mv在影片| 国产精品自产拍高潮在线观看| 在线播放国产一区中文字幕剧情欧美| 在线视频精品一| 日韩欧美精品中文字幕| 51视频国产精品一区二区| 欧美大片免费观看在线观看网站推荐| 国产精品久久久久久av福利| 91av在线视频观看| 欧美性生活大片免费观看网址|