Spring 4.1+JSONP的使用指南
JSONP就是為了解決這一問題的,JSONP是英文JSON with Padding的縮寫,是一個(gè)非官方的協(xié)議。他允許服務(wù)端生成script tags返回值客戶端,通過javascript callback的形式來實(shí)現(xiàn)站點(diǎn)訪問。JSONP是一種script tag的注入,將server返回的response添加到頁面是實(shí)現(xiàn)特定功能。
簡(jiǎn)而言之,JSONP本身不是復(fù)雜的東西,就是通過scirpt標(biāo)簽對(duì)javascript文檔的動(dòng)態(tài)解析繞過了瀏覽器的同源策略。
如今的巨石應(yīng)用已經(jīng)越來越不行了,很多互聯(lián)網(wǎng)在后期都會(huì)在用分布式的架構(gòu)
那么在頁面上不同的服務(wù)調(diào)用不同域名下的json是有問題的
(跨域:不同域名,相同域名但是不同端口)
JavaScript規(guī)范中提到的json是不能直接跨域調(diào)用,為了安全,但是能調(diào)用js片段
所以把json包裝為一個(gè)js片段,也就是jsonp那么就能夠跨域請(qǐng)求
在spring4.1后,提供了新的方法可以作為jsonp的調(diào)用
例:
@RequestMapping(value="/list") @ResponseBody public Object getItemCatList(String callback) { ItemCatResult result = itemCatService.getItemCatList(); if (StringUtils.isBlank(callback)) { //需要把result轉(zhuǎn)換成字符串 return result; } //如果字符串不為空,需要支持jsonp調(diào)用 spring4.1 以上可用 MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result); mappingJacksonValue.setJsonpFunction(callback); return mappingJacksonValue; }
如圖,這就是jsonp
那么只要在js需要調(diào)用jsonp的地方稍加處理就能夠跨域調(diào)用數(shù)據(jù)了~
做了個(gè)例子,用來在頁面上展示jsonp:
(js寫的丑了點(diǎn),本人后端出生,前端大俠們輕拍~)
var Menu = function () { return { getMenuData: function (json) { console.log(json); var data = json.data; var html = ""; for (var i = 0 ; i < data.length ; i ++) { var url = data[i].u; var name = data[i].n; var sub = data[i].i; html += ""; html += "<li class='dropdown-submenu'>"; html += "<a href='" + url + "'>" + name; html += "<span class='c-arrow c-toggler'></span>"; html += "</a>"; html += "<ul class='dropdown-menu c-pull-right'>"; for (var j = 0 ; j < sub.length ; j ++) { var url = sub[j].u; var name = sub[j].n; var node = sub[j].i; html += "<li class='dropdown-submenu'>"; html += "<a href='" + url + "'>" + name; html += "<span class='c-arrow c-toggler'></span>"; html += "</a>"; html += "<ul class='dropdown-menu c-pull-right'>"; for (var k = 0 ; k < node.length ; k ++) { // debugger var name = node[k]; var last = name.split("|"); html += "<li>"; html += "<a href='" + last[0] + "'>" + last[1] + "</a>"; html += "</li>"; } html += "</ul>"; html += "</li>"; } html += "</ul>"; html += "</li>"; } $("#itemCatMenu").html(html); }, getJSONP: function (serverUrl, callbackFun) { $.ajax({ type: "get", url: serverUrl, dataType: "jsonp", jsonp: "callback", jsonpCallback: callbackFun, success: function(json){ // console.log(json); }, error: function(e){ if (e.status != "200") { console.log(e); } } }); } }; }(); $(document).ready(function() { var serverUrl = "http://localhost:8088/rest/menu/list"; Menu.getJSONP(serverUrl, "Menu.getMenuData"); });
展示的效果:
相關(guān)文章
eclipse報(bào)錯(cuò) eclipse啟動(dòng)報(bào)錯(cuò)解決方法
本文將介紹eclipse啟動(dòng)報(bào)錯(cuò)解決方法,需要了解的朋友可以參考下2012-11-11java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解的相關(guān)資料,主要使用數(shù)組與線性表的方法來實(shí)現(xiàn),需要的朋友可以參考下2017-09-09SSH框架網(wǎng)上商城項(xiàng)目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2
SSH框架網(wǎng)上商城項(xiàng)目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2,感興趣的小伙伴們可以參考一下2016-05-05Debian 7 和 Debian 8 用戶安裝 Java 8的方法
Oracle Java 8 穩(wěn)定版本近期已發(fā)布,有很多新的特征變化。其中,有功能的程序支持通過“Lambda項(xiàng)目 ”,收到了一些安全更新和界面改進(jìn)上的bug修復(fù),使得開發(fā)人員的工作更容易。2014-03-03java導(dǎo)出包含多個(gè)sheet的Excel代碼示例
這篇文章主要介紹了java導(dǎo)出包含多個(gè)sheet的Excel,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03