為什么會(huì)有跨域問題? - 因?yàn)橛型床呗?/p>
同源策略是瀏覽器的一種安全策略,所謂同源指的是 請(qǐng)求URL地址中的 協(xié)議, 域名 和 端口 都相同,只要其中之一不相同就是跨域
同源策略主要為了保證瀏覽器的安全性
在同源策略下,瀏覽器 不允許 Ajax跨域獲取服務(wù)器數(shù)據(jù)
http://www.example.com/detail.html
跨域請(qǐng)求:
ajax的基本概念
了解這個(gè)概念,首先得先知道同步交互與異步交互
ajax主要的應(yīng)用場(chǎng)景:頁面不刷新,就可以與服務(wù)器進(jìn)行動(dòng)態(tài)的數(shù)據(jù)交互
交互的原理
我們所有的交互操作都可以通過這個(gè)對(duì)象來完成,發(fā)送請(qǐng)求,接受服務(wù)器的數(shù)據(jù)
ajax的具體應(yīng)用場(chǎng)景
XMLHttpRequest 交互的四個(gè)步驟
1,實(shí)例化XMLHttpRequest 對(duì)象
2,想和服務(wù)器進(jìn)行交互,必須和服務(wù)器打開一個(gè)連接
3,給服務(wù)器發(fā)送數(shù)據(jù),發(fā)送參數(shù)數(shù)據(jù)到服務(wù)器
4,接受服務(wù)器返回的數(shù)據(jù),服務(wù)器在返回給客戶端的時(shí)候會(huì)返回一些狀態(tài),可以通過監(jiān)聽服務(wù)器狀態(tài)的改變,來更好的操控整個(gè)交互流程
ajax跨域
跨域:假設(shè)我訪問 a 站點(diǎn),后臺(tái)返回給我一個(gè)頁面,然后我又想在 a 站點(diǎn)的這個(gè)頁面去訪問 b 站點(diǎn)的資源,這就是一個(gè)跨域的效果,跨域?yàn)g覽器是有安全限制的
解決·跨域的方式:jsonp方式
JSONP 全稱是 JSON with Padding ,是基于 JSON 格式的為解決跨域請(qǐng)求資源而產(chǎn)生的解決方案。他實(shí)現(xiàn)的基本原理是利用了 HTML 里 <script></script> 元素標(biāo)簽,遠(yuǎn)程調(diào)用 JSON 文件來實(shí)現(xiàn)數(shù)據(jù)傳遞。如要在 a.com 域下獲取存在 b.com 的 JSON 數(shù)據(jù)( getUsers.JSON ):
jsonp解決跨域的本質(zhì)原理:由于瀏覽器有同源限制,不同站點(diǎn)之間不能相互訪問,但是有時(shí)候我們就是想要獲取其他站點(diǎn)的數(shù)據(jù),比如加入我們想要獲取一下急速數(shù)據(jù)的天氣預(yù)報(bào)數(shù)據(jù),這肯定跨域了,那么我們?cè)撛趺崔k呢?
原理:就是動(dòng)態(tài)創(chuàng)建<script>標(biāo)簽,然后利用<script>的src 不受同源策略約束來跨域獲取數(shù)據(jù)。
這樣在后臺(tái)就可以獲取到前臺(tái)傳過來的那個(gè)回調(diào)函數(shù),,最后后臺(tái)返回這個(gè)函數(shù)的調(diào)用,參數(shù)為前臺(tái)請(qǐng)求的數(shù)據(jù)
js代碼
<script type="text/javascript"> function handleResponse(response){ console.log(response); } </script> <script type="text/javascript"> window.onload = function() { var oBtn = document.getElementById('btn'); oBtn.onclick = function() { var script = document.createElement("script"); script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse"; document.body.insertBefore(script, document.body.firstChild); }; }; </script>
總結(jié)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com