-
跨域解決方案:
被調(diào)用方解決:在響應(yīng)頭增加指定字段,告訴瀏覽器允許調(diào)用。這種解決方案的請(qǐng)求是直接從瀏覽器發(fā)送的
調(diào)用發(fā)解決:這是隱藏跨域的解決法案。這種跨域請(qǐng)求不是直接從瀏覽器發(fā)送的,而是從中間的http服務(wù)器轉(zhuǎn)發(fā)過(guò)去的
查看全部 -
從服務(wù)端解決跨域問(wèn)題:
(1)被調(diào)用方解決跨域問(wèn)題,被調(diào)用方修改代碼解決。
(2)調(diào)用方解決跨域,調(diào)用方修改Apache或者Nginx靜態(tài)服務(wù)器,通過(guò)靜態(tài)服務(wù)器隱藏調(diào)用請(qǐng)求返回給前臺(tái),前臺(tái)以為是同一個(gè)地址和端口的請(qǐng)求就解決了跨域問(wèn)題。
一個(gè)請(qǐng)求是怎么被處理的:當(dāng)一個(gè)請(qǐng)求從瀏覽器發(fā)出的時(shí)候,他會(huì)先到中間的http服務(wù)器或者叫靜態(tài)服務(wù)器主要是由(apache/nginx)來(lái)處理的。中間的靜態(tài)服務(wù)器收到請(qǐng)求后會(huì)判斷是靜態(tài)請(qǐng)求還是動(dòng)態(tài)請(qǐng)求,和用戶數(shù)據(jù)有關(guān)的就是動(dòng)態(tài)請(qǐng)求,如圖片,css,js就是靜態(tài)請(qǐng)求,中間的靜態(tài)服務(wù)器發(fā)現(xiàn)是靜態(tài)請(qǐng)求時(shí)就會(huì)把請(qǐng)求直接處理,然后直接返回到客戶端,如果是動(dòng)態(tài)請(qǐng)求,請(qǐng)求從客戶端發(fā)起到了中間的http服務(wù)器,中間的http服務(wù)器會(huì)把請(qǐng)求轉(zhuǎn)發(fā)到后臺(tái)的應(yīng)用服務(wù)器處理完后再返回給中間的http服務(wù)器,http服務(wù)器再把請(qǐng)求轉(zhuǎn)發(fā)到客戶請(qǐng)求。
查看全部 -
JSONP是一個(gè)非官方協(xié)議,它是一個(gè)約定,約定了一個(gè)請(qǐng)求的參數(shù)里如果包含指定的參數(shù)(默認(rèn)是callback)這就是一個(gè)JSONP請(qǐng)求,服務(wù)發(fā)現(xiàn)是一個(gè)JSONP請(qǐng)求時(shí)就會(huì)把返回的值由原來(lái)的JSON對(duì)象改變JS代碼,JS的代碼的內(nèi)容是函數(shù)調(diào)用的形式。他的函數(shù)名是callback參數(shù)的值,它的函數(shù)的參數(shù)是原來(lái)?要返回的JSON對(duì)象。
JSONP的弊端:
1. 服務(wù)器需要改動(dòng)代碼支持-如果調(diào)用的接口不是我們自己的,那么改動(dòng)就很麻煩
2. 只支持GET方法,JSONP是通過(guò)動(dòng)態(tài)創(chuàng)建一個(gè)script發(fā)送請(qǐng)求的,而script只支持GET方法
3. 發(fā)送的不是XHR請(qǐng)求,XHR有許多新的特性,如異步、各種事件等,JSONP則沒(méi)有
查看全部 -
JSONP實(shí)現(xiàn)原理。
如圖:在發(fā)送ajax請(qǐng)求的時(shí)候,
設(shè)置dataType為jsonp,即告訴后臺(tái)我需要返回的是script代碼,而不是一個(gè)json格式的數(shù)據(jù)。
jsonp設(shè)置為callback2,這個(gè)就是前后臺(tái)的協(xié)議,即后臺(tái)返回的script的方法的名稱,然后后臺(tái)將原本的json放在該方法的參數(shù)中返回給前端
在發(fā)送jsonp請(qǐng)求的時(shí)候,會(huì)帶一個(gè)_線的參數(shù),這是請(qǐng)求的唯一標(biāo)識(shí),那瀏覽器就不會(huì)緩存該請(qǐng)求,設(shè)置cache:true就可以告訴瀏覽器該請(qǐng)求是可以被緩存的。
請(qǐng)求的參數(shù)如下
查看全部 -
JSONP的原理:
jsonp是一種非正式傳輸協(xié)議,是前后臺(tái)約定的協(xié)議,而不是官方協(xié)議。
jsonp的實(shí)現(xiàn)原理是:前后臺(tái)約定帶有“callback”這個(gè)參數(shù)的請(qǐng)求就是jsonp請(qǐng)求,前臺(tái)發(fā)出去的請(qǐng)求加了“callback”參數(shù),當(dāng)后臺(tái)發(fā)現(xiàn)請(qǐng)求中帶“callback”時(shí),后臺(tái)就知道這是一個(gè)jsonp請(qǐng)求,就會(huì)把返回的數(shù)據(jù)由json變成JS代碼返回,JS代碼內(nèi)容就是一個(gè)函數(shù)的調(diào)用,函數(shù)名是“callback”參數(shù)的值,而原來(lái)需要返回的json對(duì)象數(shù)據(jù)在這里作為參數(shù)傳遞返回。
前端代碼:
....
$.ajax({
? url:....,
? dataType:"jsonp",//主要就是dataType是jsonp類型
? ......
});
setTimeout(function){
? expect(result).toEqual({
? ? ? "data":"get1 ok"
? });
..........
........
}
后臺(tái)代碼:
例如java語(yǔ)言,需繼承AbstractJsonpResponseBodyAdvice類,重寫構(gòu)造函數(shù)并傳參數(shù)“callback”,super("callback");
jsonp里傳輸?shù)木褪莏son的數(shù)據(jù)格式,只是在發(fā)送請(qǐng)求時(shí)多加一個(gè)參數(shù),其值為回調(diào)函數(shù)。后臺(tái)程序在獲得該回調(diào)函數(shù)后,把準(zhǔn)備好的json數(shù)據(jù)返回。
查看全部 -
jsonp解決跨域問(wèn)題的原理(區(qū)別):
①普通請(qǐng)求,發(fā)送請(qǐng)求時(shí),請(qǐng)求類型type默認(rèn)為 xhr? ;jsonp的請(qǐng)求類型為 script ,不會(huì)被瀏覽器認(rèn)為是跨域異常;
②普通請(qǐng)求返回的數(shù)據(jù)類型默認(rèn)為 json 格式;而 jsonp 的請(qǐng)求返回的數(shù)據(jù)類型為 javascript 的腳本;
③普通請(qǐng)求的地址后面沒(méi)有攜帶任何數(shù)據(jù);而jsonp請(qǐng)求的地址后面攜帶了 callback為鍵的一組鍵值對(duì)數(shù)據(jù);由下列圖片可知,
當(dāng)前端被設(shè)置為jsonp格式后,在后端中使用切面實(shí)現(xiàn) jsonp 的格式化接口;該接口聲明當(dāng)返回的數(shù)據(jù)有callback這個(gè)值時(shí),將返回的數(shù)據(jù)以jsonp的格式返回給前端,避免出現(xiàn)數(shù)據(jù)類型不一致的問(wèn)題。
查看全部 -
Jsonp(JSON with Padding) 是 json 的一種"使用模式",可以讓網(wǎng)頁(yè)從別的域名(網(wǎng)站)那獲取資料,即跨域讀取數(shù)據(jù)。
為什么我們從不同的域(網(wǎng)站)訪問(wèn)數(shù)據(jù)需要一個(gè)特殊的技術(shù)(JSONP )呢?這是因?yàn)橥床呗浴?/p>
使用JSONP解決跨域問(wèn)題,只改前端不改后端報(bào)語(yǔ)法錯(cuò)誤(如圖中第二條錯(cuò)誤)的原因:JSONP是使用動(dòng)態(tài)創(chuàng)建的一個(gè)script標(biāo)簽,而script標(biāo)簽返回的是JS代碼,但是服務(wù)器后臺(tái)代碼沒(méi)有做任何改動(dòng),返回的還是json對(duì)象。瀏覽器會(huì)把json對(duì)象和字符串當(dāng)作是JS代碼來(lái)解析所以就會(huì)報(bào)錯(cuò)了。解決方法:需要修改后臺(tái)代碼,新建一個(gè)類在構(gòu)造方法里寫super("callback");
查看全部 -
修改瀏覽器的設(shè)置后,沒(méi)有再出現(xiàn)跨域問(wèn)題
由此可以認(rèn)為,跨域問(wèn)題主要還是在瀏覽器發(fā)生的校驗(yàn)失敗等問(wèn)題導(dǎo)致的,與后臺(tái)沒(méi)有任何關(guān)系
查看全部 -
在瀏覽器的安裝目錄啟動(dòng)終端,輸入禁止瀏覽器做跨域檢查的校驗(yàn)參數(shù),新啟一個(gè)瀏覽器。命令參數(shù):chrome --disable-web-security --user-data-dir=g:\temp3
查看全部 -
解決思路:
1.??? 讓瀏覽器不做限制,指定參數(shù),讓瀏覽器不做校驗(yàn),但該方法不太合理,它需要每個(gè)人都去做改動(dòng)。
2.??? 不要發(fā)出XHR請(qǐng)求,這樣就算是跨域,瀏覽器也不會(huì)報(bào)錯(cuò),解決方案是JSONP,通過(guò)動(dòng)態(tài)創(chuàng)建一個(gè)script,通過(guò)script發(fā)出請(qǐng)求
3.??? 在跨域的角度:一種是被調(diào)用方修改代碼,加上字段,告訴瀏覽器,支持跨域,支持調(diào)用方調(diào)用。第二種是調(diào)用方使用代理,在a域名里面的的請(qǐng)求地址使用代理指定到b域名。第一種是支持跨域,第二種是隱藏跨域
查看全部 -
跨域安全問(wèn)題:
瀏覽器限制:瀏覽器對(duì)請(qǐng)求進(jìn)行校驗(yàn),校驗(yàn)不通過(guò)則報(bào)跨域安全問(wèn)題;(此處,前端向后臺(tái)的請(qǐng)求處理是成功的,后臺(tái)正常打印數(shù)據(jù),前端 console 也正常打印數(shù)據(jù),但瀏覽器在處理時(shí)拒絕了展示)
跨域:在交互過(guò)程中,前臺(tái)向后端發(fā)起請(qǐng)求,前臺(tái)的ip、端口與后臺(tái)的ip、端口存在任何一個(gè)不同的情況都會(huì)被認(rèn)為是跨域;
XHR(XMLHttpRequest)請(qǐng)求:發(fā)送的請(qǐng)求類型不同,發(fā)出的請(qǐng)求Type 為 json 時(shí)不會(huì)有跨域的問(wèn)題,而一般情況下,大都是 Type 為 xhr 的請(qǐng)求,所以存在跨域請(qǐng)求的問(wèn)題
發(fā)生跨域問(wèn)題的原因:
瀏覽器的限制,出于安全考慮。前臺(tái)可以正常訪問(wèn)后臺(tái),瀏覽器多管閑事報(bào)跨域問(wèn)題,但其實(shí)前臺(tái)已經(jīng)訪問(wèn)到后臺(tái)了。
跨域,協(xié)議、域名、端口任何一個(gè)不一樣瀏覽器就認(rèn)為是跨域。
XHR(XMLHttpRequest)請(qǐng)求,因?yàn)閍jax是XHR請(qǐng)求,瀏覽器就會(huì)捕捉跨域問(wèn)題。
查看全部 -
為什么會(huì)發(fā)生跨域問(wèn)題?
????1、瀏覽器限制;?
????2、跨域(域名,端口不一樣都是跨域);
????3、XHR(XMLHttpRequest請(qǐng)求);同時(shí)滿足以上三個(gè)條件就會(huì)產(chǎn)生跨域。
????????????????????????????????
解決跨域的方法
????1,從瀏覽器出發(fā),允許瀏覽器跨域。
????????思路:通過(guò)命令行修改瀏覽器啟動(dòng)參數(shù),使得瀏覽器不進(jìn)行跨域檢查,從而允許跨域
????????方法:命令行參數(shù)啟動(dòng)瀏覽器后添加參數(shù)--disable-web-security
????????例:chrome --disable-web-security
????????--disabl-web-security參數(shù)的作用是禁止瀏覽器進(jìn)行跨域檢查
????????但是,這種方法有三個(gè)缺點(diǎn):
????????????1.每次啟動(dòng)瀏覽器都需要通過(guò)命令行啟動(dòng),太過(guò)繁瑣
????????????2.該方法會(huì)導(dǎo)致安全性方面的問(wèn)題
????????????3.該方法是客戶端方面的改動(dòng),在實(shí)際使用中,在每個(gè)客戶端上都禁止瀏覽器進(jìn)行跨域檢查不太現(xiàn)實(shí),所以實(shí)用性較低。
????總的來(lái)說(shuō),該方法雖然可以解決跨域問(wèn)題,但是價(jià)值不大。在實(shí)際項(xiàng)目中,主要對(duì)服務(wù)器端進(jìn)行改動(dòng)使得支持跨域。
????
????2,從XHR(XMLHttpRequest)出發(fā)
??? (1)避免發(fā)生跨域。使用jsonp,由于jsonp請(qǐng)求是通過(guò)script的方式發(fā)送的(只有xhr的請(qǐng)求方式才有可能產(chǎn)生跨域問(wèn)題),所以不會(huì)產(chǎn)生跨域問(wèn)題。Spring MVC實(shí)現(xiàn)過(guò)程:前臺(tái)使用ajax的get請(qǐng)求,將dataType設(shè)為“jsonp”;服務(wù)器創(chuàng)建一個(gè)類并繼承抽象類AbstractJsonReponseBodyAdvice,最后注解@ControllerAdivece。使用jsonp的弊端,只能使用get方式請(qǐng)求,服務(wù)器需要改動(dòng)代碼,發(fā)送的不是xhr請(qǐng)求。
????????????????????
(2)產(chǎn)生跨域后解決。
????????????從被調(diào)用方考慮,有三種情況,分別是服務(wù)器實(shí)現(xiàn),nginx配置和apache配置。
????????? ? 服務(wù)器實(shí)現(xiàn)需要注意兩種情況,簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求。簡(jiǎn)單請(qǐng)求是先執(zhí)行請(qǐng)求再驗(yàn)證,非簡(jiǎn)單請(qǐng)求是先驗(yàn)證再請(qǐng)求。
????????? 簡(jiǎn)單請(qǐng)求(比較常見(jiàn)):方法為get,head,post,請(qǐng)求header里面沒(méi)有自定義頭,Content-Type的值為以下幾種 text/plain,multipart/form-data,application/x-www-form-urlencoded。
??????????? 非簡(jiǎn)單請(qǐng)求(比較常見(jiàn)):put,delect方法的ajax請(qǐng)求,發(fā)送json格式的ajax請(qǐng)求,帶自定義頭的ajax請(qǐng)求。
????????????簡(jiǎn)單請(qǐng)求處理方案:在響應(yīng)頭中添加
????????????????Access-Control-Allow-Origin=“允許跨域的url”,即跨省域時(shí),請(qǐng)求頭Origin的值,所以一般是獲取Origin的值。
??????????????? Access-Control-Allow-Method=“*”,允許的方法。
????????????非簡(jiǎn)單請(qǐng)求處理方案:在相應(yīng)頭中添加
??????????????? Access-Control-Allow-Origin=“允許跨域的url”,即跨域時(shí),可以獲取請(qǐng)求頭Origin的值。
??????????????? Access-Control-Allow-Method=“*”,允許的方法
??????????????? Access-Control-Request-Headers=“Content-Type,自定義的header的key”。
???????????? 帶cookies的跨域解決:在響應(yīng)頭添加
????????????????Access-Control-Allow-Credentials,="true",允許使用cookies
?????ngnix配置:
????????????????????
查看全部 -
jasmine 是一個(gè)行為驅(qū)動(dòng)開(kāi)發(fā)(TDD)測(cè)試框架, 一個(gè)js測(cè)試框架,它不依賴于瀏覽器、dom或其他js框架;jasmine有十分簡(jiǎn)介的語(yǔ)法。
下載:https://github.com/jasmine/jasmine/releases
官方參考API:https://www.cnblogs.com/stephenykk/p/4539200.html
查看全部 -
使用自動(dòng)聲明獲取自定義請(qǐng)求頭的參數(shù)的方式,再將參數(shù)添加到過(guò)濾器中 req.getHeader(“自定義請(qǐng)求頭”);<br/>查看全部
-
在過(guò)濾器中聲明自定義的請(qǐng)求頭,以解決自定義請(qǐng)求跨域的問(wèn)題
請(qǐng)求頭參數(shù):"Content-Type,x-header1,x-header2"
查看全部
舉報(bào)