摘要:慣例上瀏覽器提供回調(diào)函數(shù)的名稱當作送至服務(wù)器的請求中命名查詢參數(shù)的一部分,例如服務(wù)器會在傳給瀏覽器前將數(shù)據(jù)填充到回調(diào)函數(shù)中。
1 什么是Jsonp?
JSONP(JSON with Padding)是數(shù)據(jù)格式JSON的一種“使用模式”,可以讓網(wǎng)頁從別的網(wǎng)域要數(shù)據(jù)。另一個解決這個問題的新方法是跨來源資源共享。
由于同源策略,一般來說位于www.42du.cn的網(wǎng)頁無法與不是 www.42du.cn的服務(wù)器溝通,而HTML的 < script >元素是一個例外。利用 < script >元素的這個開放策略,網(wǎng)頁可以得到從其他來源動態(tài)產(chǎn)生的JSON數(shù)據(jù),而這種使用模式就是所謂的JSONP。用JSONP抓到的數(shù)據(jù)并不是JSON,而是任意的JavaScript,用 JavaScript解釋器運行而不是用JSON解析器解析。
2 Jsonp基本原理為了理解這種模式的原理,先想像有一個回傳JSON文件的URL,而JavaScript 程序可以用XMLHttpRequest跟這個URL要數(shù)據(jù)。假設(shè)我們的URL是 http://tools.42du.cn/jsonp/st... 。假設(shè)iFat3的st_no是3,當瀏覽器通過URL傳遞iFat3的st_id,也就是抓取http://tools.42du.cn/jsonp/st...,得到:
{"st_no":3,"st_name":"iFat3","st_desc":"iFat3是學校的超級學渣"}
這個JSON數(shù)據(jù)可能是依據(jù)傳過去URL的查詢參數(shù)動態(tài)產(chǎn)生的。
這個時候,把 < script >元素的src屬性設(shè)成一個回傳JSON的URL是可以想像的,這也代表從HTML頁面通過script元素抓取 JSON是可能的。
然而,一份JSON文件并不是一個JavaScript程序。為了讓瀏覽器可以在 < script >元素運行,從src里URL 回傳的必須是可運行的JavaScript。在JSONP的使用模式里,該URL回傳的是由函數(shù)調(diào)用包起來的動態(tài)生成JSON,這就是JSONP的“填充(padding)”或是“前輟(prefix)”的由來。
慣例上瀏覽器提供回調(diào)函數(shù)的名稱當作送至服務(wù)器的請求中命名查詢參數(shù)的一部分,例如:
服務(wù)器會在傳給瀏覽器前將JSON數(shù)據(jù)填充到回調(diào)函數(shù)(callback)中。瀏覽器得到的回應(yīng)已不是單純的數(shù)據(jù)敘述而是一個腳本。在本例中,瀏覽器得到的是:
/**/callback({"st_no":3,"st_name":"iFat3","st_desc":"iFat3是學校的超級學渣"});3 服務(wù)端生成Jsonp
本例中的Jsonp利用的是Spring Framework的JSonp處理部分生成,詳細內(nèi)容請閱讀官方文檔。鏈接見相關(guān)資料中的spring部分,本人強烈建意您在實際開發(fā)過程中,先閱讀官方文檔,再進行代碼編寫。
3.1 模型(model)對象Student模型對象的get和set方法未列出。
public class Student extends BaseBean implements Serializable { private Integer st_no; private String st_name; private String st_desc; }3.2 spring的Jsonp處理
@ControllerAdvice @RequestMapping("/jsonp") public class StudentJsonpAdvice extends AbstractJsonpResponseBodyAdvice { private List4 客戶端取得Jsonp數(shù)據(jù)students = new ArrayList (); public StudentJsonpAdvice() { super("callback"); initData(); } @RequestMapping(value="/student/all",method= RequestMethod.GET) @ResponseBody public List list(){ return students; } @RequestMapping(value="/student/{st_no}",method= RequestMethod.GET) @ResponseBody public Student info(@PathVariable Integer st_no){ if(st_no != null) { if(st_no > 0 && st_no <4) { return students.get(st_no -1); } return students.get(0); } return null; } private void initData() { Student st1 = new Student(1,"王美麗","王美麗是學校的校花"); Student st2 = new Student(2,"毛三胖","毛三胖是學校的學霸"); Student st3= new Student(3,"iFat3","iFat3是學校的超級學渣"); students.add(st1); students.add(st2); students.add(st3); } }
利用JQuery的ajax方法取得所有學生的數(shù)據(jù),并利用回調(diào)函數(shù)(callback)將數(shù)據(jù)插入到頁面中。更多JQuery的ajax方法參見相關(guān)資料中的JQuery部分。
function callback(data) { $(data).each(function(i,item){ $("#stu_ul").append("
Spring處理Jsonp文檔
JQuery Ajax官方文檔
維基Jsonp條目
菜鳥Jsonp教程
JSON中文介紹
學生列表Jsonp地址
學生信息Jsonp地址
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/83305.html
摘要:時間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。當預(yù)檢請求通過的時候,才發(fā)送真正的請求。 時間:2018年04月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介...
摘要:而在面試過程中,也是經(jīng)常會遇到的,所以,無論是面試準備還是日常開發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點。根據(jù)二分點的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進入...
摘要:,跨站腳本攻擊。實際發(fā)的請求就是,用于表示這是一個請求。,用于告知服務(wù)器根據(jù)這個參數(shù)獲取回調(diào)函數(shù)的名稱,通常約定就叫。,回調(diào)函數(shù)的名稱,也是前面參數(shù)的值,可省略,會自動生成。 本次課程主要圍繞 PHP 面試和筆試中經(jīng)常會出現(xiàn)的一些知識點,但是面試官會在筆試題基礎(chǔ)上深入擴展,那么你知道如何更好的回答讓面試官滿意嗎?題目收集自騰訊,迅雷,美圖等公司的筆試面試題,以及本人面試經(jīng)歷中印象中的知...
摘要:同源策略在中有一個很重要的安全性限制,被稱為同源策略。然而,當進行一些比較深入的前端編程的時候,不可避免地需要進行跨域操作,這時候同源策略就顯得過于苛刻。 JSONP原理 JSON和JSONP JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。對于JSON大家應(yīng)該是很了解了吧,不是很清楚的朋友可以去json.org上了解下,簡單易懂。 ...
閱讀 2884·2021-11-24 09:39
閱讀 2611·2021-11-23 09:51
閱讀 2224·2021-11-17 09:33
閱讀 1850·2021-10-22 09:54
閱讀 1936·2021-08-16 11:00
閱讀 3529·2019-08-30 15:53
閱讀 1793·2019-08-30 13:19
閱讀 2965·2019-08-30 12:49