-
禁止瀏覽器校驗(yàn)啟動方式:
查看全部 -
4、Filter解決跨域方案
問題1:瀏覽器是先執(zhí)行請求還是先判斷跨域?
????瀏覽器請求-->判斷響應(yīng)中是否有允許跨域-->發(fā)現(xiàn)不允許跨域,阻止跨域
????說明:當(dāng)執(zhí)行跨域請求時,瀏覽器會提示當(dāng)前接口不被允許,這說明瀏覽器已發(fā)出了當(dāng)前請求,但是它的的響應(yīng)內(nèi)容被攔截;如果在Response?header中的Access-Control-Allow-Origin設(shè)置的允許訪問源不包含當(dāng)前源,則拒絕數(shù)據(jù)返回給當(dāng)前源。
問題2:判斷當(dāng)前請求是否是跨域請求的方法?
????通過查看當(dāng)前請求的Request Headers 中是否存在Origin屬性,當(dāng)前屬性存儲的是當(dāng)前域的信息
在被調(diào)用方解決跨域(支持跨域)通過自定義Filter來實(shí)現(xiàn):
????1、在SpringBoot工程創(chuàng)建自定攔截器CrosFilter,如圖:
????2、?注冊自定攔截器CrosFilter,作用于全局如圖:
問題3:什么是簡單請求和非簡單請求?
????說明:瀏覽器在發(fā)送跨域請求時會先判斷當(dāng)前請求是不是簡單請求,如果是簡單請求瀏覽器則會先執(zhí)行請求,再判斷是否支持跨域;如果是非簡單請求它會先發(fā)送一個預(yù)檢命令(即OPTIONS請求),檢查通過后再把當(dāng)前請求發(fā)出去。
????1、簡單請求:
????????方法為GET、HEAD、POST的請求,并且請求頭(header)里面沒有自定義頭;Content-Type為text/plain、multipart/form-data、application/x-www-form-urlencoded。
????2、非簡單請求:
????????方法為PUT、DELETE的請求,發(fā)送JSON格式的ajax請求、帶自定義請求頭的ajax請求。
????例子:發(fā)送JSON格式的ajax請求
????
問題4:Access-Control-Allow-Headers是什么?有什么作用?
????響應(yīng)頭部 Access-Control-Allow-Headers 用于 preflight request (預(yù)檢請求)中,列出了將會在正式請求的 Access-Control-Expose-Headers 字段中出現(xiàn)的首部信息。簡單首部,如 simple headers、Accept、Accept-Language、Content-Language、Content-Type (只限于解析后的值為 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 三種MIME類型(不包括參數(shù))),它們始終是被支持的,不需要在這個首部特意列出。
問題5:Access-Control-Max-Age是什么?
瀏覽器的同源策略,就是出于安全考慮,瀏覽器會限制從腳本發(fā)起的跨域HTTP請求(比如異步請求GET, POST, PUT, DELETE, OPTIONS等等),所以瀏覽器會向所請求的服務(wù)器發(fā)起兩次請求,第一次是瀏覽器使用OPTIONS方法發(fā)起一個預(yù)檢請求,第二次才是真正的異步請求,第一次的預(yù)檢請求獲知服務(wù)器是否允許該跨域請求:如果允許,才發(fā)起第二次真實(shí)的請求;如果不允許,則攔截第二次請求。Access-Control-Max-Age用來指定本次預(yù)檢請求的有效期,單位為秒,,在此期間不用發(fā)出另一條預(yù)檢請求。
????例如:res.addHeader("Access-Control-Max-Age", "3600"),表示隔60分鐘才發(fā)起預(yù)檢請求
查看全部 -
3、JSONP如何解決跨域
????1、什么是JSONP?
????JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過這種模式可以實(shí)現(xiàn)數(shù)據(jù)的跨域獲取。
????2、JSONP處理跨域的原理
????在同源策略下,在某個服務(wù)器下的頁面是無法獲取到該服務(wù)器以外的數(shù)據(jù)的,但img、iframe、script等標(biāo)簽是個例外,這些標(biāo)簽可以通過src屬性請求到其他服務(wù)器上的數(shù)據(jù)。利用script標(biāo)簽的開放策略,我們可以實(shí)現(xiàn)跨域請求數(shù)據(jù),當(dāng)然,也需要服務(wù)端的配合。當(dāng)我們正常地請求一個JSON數(shù)據(jù)的時候,服務(wù)端返回的是一串JSON類型的數(shù)據(jù),而我們使用JSONP模式來請求數(shù)據(jù)的時候,服務(wù)端返回的是一段可執(zhí)行的JavaScript代碼。
????舉例:假如需要從服務(wù)器(http://www.a.com/user?id=123)獲取的數(shù)據(jù)如下:
????{"id":?123,?"name"?:?張三,?"age":?17}
????那么,使用JSONP方式請求(http://www.a.com/user?id=123?callback=foo)的數(shù)據(jù)將會是如下:?
????foo({"id":?123,?"name"?:?張三,?"age":?17});
????當(dāng)然,如果服務(wù)端考慮得更加充分,返回的數(shù)據(jù)可能如下:?
????try{foo({"id":?123,?"name"?:?張三,?"age":?17});}catch(e){}
????這時候我們只要定義一個foo()函數(shù),并動態(tài)地創(chuàng)建一個script標(biāo)簽,使其的src屬性為http://www.a.com/user?id=123?callback=foo: 便可以使用foo函數(shù)來調(diào)用返回的數(shù)據(jù)了。
在JQuery中使用JSONP解決跨域
解決一:指定ajax請求的dataType屬性為jsonp
$.ajax({ ????????dataType:?'jsonp', ????????url:?'http://www.a.com/user?id=123', ????????success:?function(data){ ????????????????//處理data數(shù)據(jù) ????????} });
解決二:使用getJSON,只要在請求地址中加上callback=?參數(shù)可:?
$.getJSON('http://www.a.com/user?id=123&callback=?',?function(data){ ????????//處理data數(shù)據(jù) }); 或者是 function?foo(data){ ????????//處理data數(shù)據(jù) } $.getJSON('http://www.a.com/user?id=123&callback=foo');
查看全部 -
2、為什么會發(fā)生跨域問題?
????1、瀏覽器限制;?
????2、跨域(域名,端口不一樣都是跨域);
????3、XHR(XMLHttpRequest請求);同時滿足以上三個條件就會產(chǎn)生跨域。
????????????????????????????????
解決跨域的方法
????1,從瀏覽器出發(fā),允許瀏覽器跨域。
????????思路:通過命令行修改瀏覽器啟動參數(shù),使得瀏覽器不進(jìn)行跨域檢查,從而允許跨域
????????方法:命令行參數(shù)啟動瀏覽器后添加參數(shù)--disable-web-security
????????例:chrome --disable-web-security
????????--disabl-web-security參數(shù)的作用是禁止瀏覽器進(jìn)行跨域檢查
????????但是,這種方法有三個缺點(diǎn):
????????????1.每次啟動瀏覽器都需要通過命令行啟動,太過繁瑣
????????????2.該方法會導(dǎo)致安全性方面的問題
????????????3.該方法是客戶端方面的改動,在實(shí)際使用中,在每個客戶端上都禁止瀏覽器進(jìn)行跨域檢查不太現(xiàn)實(shí),所以實(shí)用性較低。
????總的來說,該方法雖然可以解決跨域問題,但是價值不大。在實(shí)際項(xiàng)目中,主要對服務(wù)器端進(jìn)行改動使得支持跨域。
????
????2,從XHR(XMLHttpRequest)出發(fā)
??? (1)避免發(fā)生跨域。使用jsonp,由于jsonp請求是通過script的方式發(fā)送的(只有xhr的請求方式才有可能產(chǎn)生跨域問題),所以不會產(chǎn)生跨域問題。Spring MVC實(shí)現(xiàn)過程:前臺使用ajax的get請求,將dataType設(shè)為“jsonp”;服務(wù)器創(chuàng)建一個類并繼承抽象類AbstractJsonReponseBodyAdvice,最后注解@ControllerAdivece。使用jsonp的弊端,只能使用get方式請求,服務(wù)器需要改動代碼,發(fā)送的不是xhr請求。
????????????????????
(2)產(chǎn)生跨域后解決。
????????????從被調(diào)用方考慮,有三種情況,分別是服務(wù)器實(shí)現(xiàn),nginx配置和apache配置。
????????? ? 服務(wù)器實(shí)現(xiàn)需要注意兩種情況,簡單請求和非簡單請求。簡單請求是先執(zhí)行請求再驗(yàn)證,非簡單請求是先驗(yàn)證再請求。
????????? 簡單請求(比較常見):方法為get,head,post,請求header里面沒有自定義頭,Content-Type的值為以下幾種 text/plain,multipart/form-data,application/x-www-form-urlencoded。
??????????? 非簡單請求(比較常見):put,delect方法的ajax請求,發(fā)送json格式的ajax請求,帶自定義頭的ajax請求。
????????????簡單請求處理方案:在響應(yīng)頭中添加
????????????????Access-Control-Allow-Origin=“允許跨域的url”,即跨省域時,請求頭Origin的值,所以一般是獲取Origin的值。
??????????????? Access-Control-Allow-Method=“*”,允許的方法。
????????????非簡單請求處理方案:在相應(yīng)頭中添加
??????????????? Access-Control-Allow-Origin=“允許跨域的url”,即跨域時,可以獲取請求頭Origin的值。
??????????????? Access-Control-Allow-Method=“*”,允許的方法
??????????????? Access-Control-Request-Headers=“Content-Type,自定義的header的key”。
???????????? 帶cookies的跨域解決:在響應(yīng)頭添加
????????????????Access-Control-Allow-Credentials,="true",允許使用cookies
?????ngnix配置:
????????????????????
查看全部 -
1、前端測試框架Jasmine
jasmine 是一個行為驅(qū)動開發(fā)(TDD)測試框架, 一個js測試框架,它不依賴于瀏覽器、dom或其他js框架;jasmine有十分簡介的語法。
下載:https://github.com/jasmine/jasmine/releases
官方參考API:https://www.cnblogs.com/stephenykk/p/4539200.html
查看全部 -
解決思路:
讓瀏覽器不做限制,指定參數(shù),讓瀏覽器不做校驗(yàn),但該方法不太合理,它需要每個人都去做改動。
不要發(fā)出XHR請求,這樣就算是跨域,瀏覽器也不會報錯,解決方案是JSONP,通過動態(tài)創(chuàng)建一個script,通過script發(fā)出請求
在跨域的角度:一種是被調(diào)用方修改代碼,加上字段,告訴瀏覽器,支持跨域,支持調(diào)用方調(diào)
查看全部 -
Ajax跨域受哪些條件限制:
瀏覽器限制不允許跨域;
訪問的域和請求頁的域不同;
使用XHR(XMLHttpRequest)請求,不允許跨域
查看全部 -
Ajax跨域受哪些條件限制:
瀏覽器限制不允許跨域;
訪問的域和請求頁的域不同;
使用XHR(XMLHttpRequest)請求,不允許跨域
查看全部 -
反向代理,隱藏
查看全部 -
nginx 配置?
查看全部 -
創(chuàng)建controller時重新創(chuàng)建了一個包放TestController.java和ResultBean.java,導(dǎo)致在啟動后訪問時,報404,解決:將這兩個文件和AjaxserverApplication.java放在一個包中
查看全部 -
禁止瀏覽器做檢查校驗(yàn)
在Dos中 瀏覽器應(yīng)用對應(yīng)文件Appliction文件夾下輸入
chrome --disable-web-security --user-data-dir=g:\temp3
查看全部 -
解決思路:
讓瀏覽器不做限制,指定參數(shù),讓瀏覽器不做校驗(yàn),但該方法不太合理,它需要每個人都去做改動。
不要發(fā)出XHR請求,這樣就算是跨域,瀏覽器也不會報錯,解決方案是JSONP,通過動態(tài)創(chuàng)建一個script,通過script發(fā)出請求
在跨域的角度:一種是被調(diào)用方修改代碼,加上字段,告訴瀏覽器,支持跨域,支持調(diào)用方調(diào)用。第二種是調(diào)用方使用代理,在a域名里面的的請求地址使用代理指定到b域名。第一種是支持跨域,第二種是隱藏跨域
查看全部 -
發(fā)生跨域安全的問題的原因,三者都滿足
查看全部 -
使用nginx解決跨域
查看全部
舉報