利用JSONP解決AJAX跨域問題的原理與jQuery解決方案

寫在前面

跨域的解決方案有多種,其中最常見的是使用同一服務器下的代理來獲取遠端數據,再通過ajax進行讀取,而在這期間經過了兩次請求過程,使得獲取數據的效率大大降低,這篇文章藍飛就為大家介紹一下解決跨域問題的一種比較通用的方案——JSONP。

?

?

什么是跨域?

簡單的來說,出于安全方面的考慮,頁面中的JavaScript無法訪問其他服務器上的數據,即“同源策略”。而跨域就是通過某些手段來繞過同源策略限制,實現不同服務器之間通信的效果。

?

具體策略限制情況可看下表:

URL說明允許通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下允許
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夾允許
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口不允許
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同協議不允許
http://www.a.com/a.js
http://127.0.0.100/b.js
域名和域名對應ip不允許
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同不允許
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二級域名(同上)不允許
http://www.a.com/a.js
http://www.b.com/b.js
不同域名不允許

?

什么是JSONP?

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過這種模式可以實現數據的跨域獲取。?

?

JSONP跨域的原理

在同源策略下,在某個服務器下的頁面是無法獲取到該服務器以外的數據的,但img、iframe、script等標簽是個例外,這些標簽可以通過src屬性請求到其他服務器上的數據。利用script標簽的開放策略,我們可以實現跨域請求數據,當然,也需要服務端的配合。當我們正常地請求一個JSON數據的時候,服務端返回的是一串JSON類型的數據,而我們使用JSONP模式來請求數據的時候,服務端返回的是一段可執行的JavaScript代碼。

?

舉個例子,假如需要從服務器(http://www.a.com/user?id=123)獲取的數據如下:

  1. {"id":?123,?"name"?:?張三,?"age":?17}

那么,使用JSONP方式請求(http://www.a.com/user?id=123?callback=foo)的數據將會是如下:?

  1. foo({"id":?123,?"name"?:?張三,?"age":?17});

當然,如果服務端考慮得更加充分,返回的數據可能如下:?

  1. try{foo({"id":?123,?"name"?:?張三,?"age":?17});}catch(e){}

這時候我們只要定義一個foo()函數,并動態地創建一個script標簽,使其的src屬性為http://www.a.com/user?id=123?callback=foo:?

 

便可以使用foo函數來調用返回的數據了。?

?

在jQuery中如何通過JSONP來跨域獲取數據

第一種方法是在ajax函數中設置dataType為'jsonp':?

  1. $.ajax({
  2. ? ? ? ? dataType:?'jsonp',
  3. ? ? ? ? url:?'http://www.a.com/user?id=123',
  4. ? ? ? ? success:?function(data){
  5. ? ? ? ? ? ? ? ??//處理data數據
  6. ? ? ? ??}
  7. });

第二種方法是利用getJSON來實現,只要在地址中加上callback=?參數即可:?

  1. $.getJSON('http://www.a.com/user?id=123&callback=?',?function(data){
  2. ? ? ? ??//處理data數據
  3. });

也可以簡單地使用getScript方法:

  1. //此時也可以在函數外定義foo方法
  2. function?foo(data){
  3. ? ? ? ??//處理data數據
  4. }
  5. $.getJSON('http://www.a.com/user?id=123&callback=foo');

?

JSONP的應用

JSONP在開放API中可以起到非常重要的作用,開放API是運用在開發者自己的應用上,而許多應用往往是在開發者的服務器上而不是在新浪微博的服務器上,因此跨域請求數據成為開發者們所需要解決的一大問題,廣大開放平臺應該實現對JSONP的支持,這一點新浪微博開放平臺便做的非常好(雖然某些API里沒有說明,但實際上是可以使用JSONP方式調用的)。



=======================簽 名 檔=======================
原文地址(我的博客):http://www.clanfei.com/2012/08/1637.html
歡迎訪問交流,至于我為什么要多弄一個博客,因為我熱愛前端,熱愛網頁,我更希望有一個更加自由、真正屬于我自己的小站,或許并不是那么有名氣,但至少能夠讓我為了它而加倍努力。。
=======================簽 名 檔=======================

轉自:http://blog.csdn.net/coolanfei/article/details/7849735

轉載于:https://www.cnblogs.com/zhengteng/p/5297203.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

江西理工大學南昌校區cool code競賽

這次比賽原本就是來打醬油的,想做個簽到題就走!一開始不知道1002是簽到題,一直死磕1001,WA了四發過了,回頭一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一個人AC…

mysql 枚舉_詳解MySQL數據類型之枚舉類型ENUM的用法

本節主要內容:MySQL數據類型之枚舉類型ENUMMySQL數據庫提供針對字符串存儲的一種特殊數據類型:枚舉類型ENUM,這種數據類型可以給予我們更多提高性能、降低存儲容量和降低程序代碼理解的技巧,前面介紹了首先介紹了四種數據類型的特…

# 異運算_小學數學運算三要點:定律、法則與順序(解析)

很多孩子的數學不好,尤其是女孩子。家長往往認定為數學不好就是孩子不擅長,能力差。其實未必,有的孩子數學不好的原因并不在于智商,而是沒有理解到數學的方法與邏輯,比如小學的運算中,很多孩子并沒有了解到…

如何實現一個教師與學生教學輔助平臺?

在軟件工程的學習過程中,我們要完成一個團體項目,關于個人教學輔助系統,對于這個,還有太多要學。對于如何實現其中的功能,我們會利用到html,css等語言來編寫網頁前端,同樣也會用到數據庫的知識。…

證明創建runnable實例和普通類時間一樣長

import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;//證明創建runnable實例和普通類時間一樣長public class Test002 { private Concurre…

mysql數據庫維護_維護MySQL數據庫表

在本教程中,我們將向您介紹一些非常有用的語句,使您可以在MySQL中維護數據庫表。MySQL提供了幾個有用的語句,可以有效地維護數據庫表。 這些語句使您能夠分析,優化,檢查和修復數據庫表。分析表語句MySQL查詢優化器是My…

node-glob 正則表達式

https://github.com/isaacs/node-glob轉載于:https://www.cnblogs.com/chris-oil/p/6507368.html

機器學習筆記—再談廣義線性模型

前文從線性回歸和 Logistic 回歸引出廣義線性回歸的概念,很多人還是很困惑,不知道為什么突然來個廣義線性回歸,有什么用?只要知道連續值預測就用線性回歸、離散值預測就用 Logistic 回歸不就行了?還有一些概念之間的關…

python連接access數據庫odbc_對Python通過pypyodbc訪問Access數據庫的方法詳解

看書上通過ODBC訪問數據庫的案例,想實踐一下在Python 3.6.1中實現access2003數據庫的鏈接,但是在導入odbc模塊的時候出現了問題,后來查了一些資料就嘗試著使用pypyodbc,最后成功了。操作步驟:①安裝pypyodbc目前Python…

mysql異機備份

xx.xx..4.43----xx.xx..4.51 1、配置client通過密鑰來連接server 43機器上: /root/.ssh 目錄下執行 ssh-keygen -t rsa ls /root/.ssh會發現在/root/.ssh下生成一對密鑰id_dsa和id_dsa.pub,將生成的公鑰id_dsa.pub拷貝到server的/root/.ssh目錄下&#…

周末想找個地方敲代碼_觀看我們的代碼游戲,全周末直播

周末想找個地方敲代碼by freeCodeCamp通過freeCodeCamp 觀看我們的代碼游戲,全周末直播 (Watch us Code Games Live All Weekend) Note: this was originally published on our now-defunct blog on July 15, 2015.注意:該文章最初于2015年7月15日發布在…

5.7和5.6的mysql_mysql5.6和5.7的區別

展開全部MySQL 5.7 已經開發兩年了。相比 MySQL 5.6,有特別多的改進。團隊主要關注速度,性能據報告是比之前62616964757a686964616fe4b893e5b19e31333365643661版本提升了 2 至 3 倍。新特性列表,主要改進:提升 MySQL 安全性改進了…

01:數制轉換

01:數制轉換 查看提交統計提問總時間限制: 1000ms內存限制: 65536kB描述求任意兩個不同進制非負整數的轉換(2進制~16進制),所給整數在long所能表達的范圍之內。不同進制的表示符號為(0,1,...&am…

局域網只能看到一部分電腦_win10 網上鄰居看不到其它電腦、共享不了文件

最近電腦遇到了局域網文件共享的問題,Win 10 系統在網絡和共享中心里無法看到其他電腦,只能看到本機。確認共享已經打開后,通過查找最終解決。下面是解決流程。1.進入:控制面板 – 網絡和共享中心 – 更改高級共享設置&#xff0c…

javascript 開發_25個新JavaScript開發人員的免費資源

javascript 開發by freeCodeCamp通過freeCodeCamp 25個新JavaScript開發人員的免費資源 (25 Free Resources for New JavaScript Developers) We asked our campers to share their favorite free resources for new JavaScript developers on Camper News. The list includes…

mysql數據庫語法_MySQL數據庫語法(一)

MySQL數據庫語法數據庫管理系統(DBMS)的概述什么是DBMS:數據的倉庫方便查詢可存儲的數據量大保證數據的完整、一致安全可靠DBMS的發展:今天主流數據庫為關系型數據庫管理系統(RDBMS 使用表格存儲數據)常見DBMS:Orcale、MySQL、SQL Server、DB…

作業1---四則運算

一.需求分析: 除了整數以外,還要支持真分數的四則運算,真分數的運算,例如:1/6 1/8 7/24 運算符為 , ?, , 并且要求能處理用戶的輸入,并判斷對錯,打分統計正確率。 要求能處理用戶輸入的真分…

python有序數組中刪除元素_python刷LeetCode:26. 刪除排序數組中的重復項

題目描述:給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。不要使用額外的數組空間,你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。示例 1:給定數組…

mysql數據庫修改數據庫名稱_MySQL數據庫之MySQL 修改數據庫名稱的一個新奇方法...

本文主要向大家介紹了MySQL數據庫之MySQL 修改數據庫名稱的一個新奇方法 ,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。MySQL在5.1引入了一個rename database操作,但在MySQL5.1.23后又不支持這個命令。可以說是一個實驗性的…

Lesson 001 —— 數據

Lesson 001 —— 數據 數據(data)是事實或觀察的結果,是對客觀事物的邏輯歸納,是用于表示客觀事物的未經加工的原始素材。數據是信息的表現形式和載體,可以使符號、文字、數字、語音、圖像、視頻等。 進制 進制也就是進…