ajax和jsonp没有半点关系,跨域问题
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
jsonp確實和ajax沒有半毛錢關(guān)系,只算是一種機制跨域數(shù)據(jù)獲取方案或者協(xié)議。
只是說很多庫(比如jquery)里面對jsonp和ajax做了一樣的封裝,看起來就好像jsonp是ajax的一部分一樣,這好像會造成誤解。
ajax是使用js內(nèi)置的對象進行網(wǎng)絡(luò)請求獲取數(shù)據(jù)
jsonp是使用script當中的src來獲取數(shù)據(jù)
什么時候跨域
一個域名訪問另外一個域名
什么時候出現(xiàn)要跨域情況
1、以下是造成跨域的一些情況,只有目錄路徑不同才是同源地址
跨域的直觀認識
一個域名地址需要訪問另外一個域名地址的數(shù)據(jù)
為什么會有跨域?
-->說白了是為了數(shù)據(jù)的安全
出于安全性考慮,瀏覽器不允許ajax跨域獲取數(shù)據(jù)
瀏覽器為了保證數(shù)據(jù)的安全,不允許直接請求使用別的域名數(shù)據(jù)。瀏覽器做了一個攔截。其實數(shù)據(jù)已經(jīng)響應(yīng)到了瀏覽器。瀏覽器沒有把它給我們,不會隨意注入你的瀏覽器。例如黑客會通過重定向把一些你不想打開的網(wǎng)頁在你的瀏覽器中打開
是誰導(dǎo)致了跨域?
-->瀏覽器
需求:當用戶當請求一個地址要拿到里面的數(shù)據(jù)展示在自己的域名當中
現(xiàn)實:拿不到數(shù)據(jù)顯示在自己的域名當中
原因:當你訪問地址的時候,實際上數(shù)據(jù)已經(jīng)從別的域名拿過來了(可以從network上的接收包查看),但是瀏覽器為了保障不被信用的數(shù)據(jù)注入本地,進行了攔截。
解決跨域的兩種方法
1、在瀏覽器安裝插件(自己百度)
2、通過src實現(xiàn)跨域方案
講第二種方法之前先了解一下基本概念:
使用src內(nèi)容請求是不會存在跨域問題,在服務(wù)器端,返回js語句是可以直接運行。
服務(wù)器或者說后臺(php)不存在跨域問題,當遇到跨域問題時通過PHP文件(自身文件)進行訪問。
所以通過第二種方式解決跨域,必須前后臺的合作才能私行(前臺傳callback參數(shù),后臺服務(wù)器接收callback并返回數(shù)據(jù))。步驟:
? ? ? ? 0.在前端定義一個function.
? ? ? ? ? ? function fn(res) {
? ? ? ? ? ? ? ? alert(res);
? ? ? ? ? ? ?}
? ? ? ? 1.通過<script src=> 向服務(wù)器發(fā)送一個請求。 在發(fā)送請求過程當中。把function的名稱做為參數(shù)傳給服務(wù)器。
? ? ? ? ? ?<script src="get.php?callback=fn"></script>
? ? ? ? 2.服務(wù)器接收callback值。
? ? ? ? ? $fn = $_GET['callback'];
? ? ? ? 3.在返回時,在接收參數(shù)這后面拼接一個括號。
? ? ? ? ? 如果想要傳遞數(shù)據(jù),就把數(shù)據(jù)放到括號當中。
? ? ? ? ? echo ?$fn.'("xmg123")';
? ? ? ? 4.就會執(zhí)行前端定義的function
? ? ? ? ? fn("hello");
?
jsonp不是使用xhr對象發(fā)送請求,而是創(chuàng)建一個script標簽,標簽的src屬性設(shè)置成要請求的URL。當標簽插入dom時瀏覽器就會自動請求這個URL,并把結(jié)果當做js代碼執(zhí)行。這樣做的優(yōu)點是跨域,缺點是只能使用get,而且不能設(shè)置header。因為請求完全不受js控制
jsonp的限制是來源于src的限制,src是不可能做到post請求的
有一篇討論帖可以解答?https://segmentfault.com/q/1010000004884037
轉(zhuǎn)載于:https://my.oschina.net/u/2949632/blog/812474
總結(jié)
以上是生活随笔為你收集整理的ajax和jsonp没有半点关系,跨域问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大规模分布式存储系统(文摘)
- 下一篇: 初次使用Android Studio问题