跨域的概述
下面是使用ajax發(fā)送請(qǐng)求跨域訪(fǎng)問(wèn)資源出現(xiàn)的問(wèn)題:請(qǐng)求的資源上不存在“訪(fǎng)問(wèn)控制允許源”標(biāo)頭:(就是被同源策略阻止了)
區(qū)別同源與不同源
區(qū)分同源和不同源的三要素:
協(xié)議域名端口協(xié)議一致,域名一致,端口號(hào)一致,三要素都要一致,才是同源,其它一律都是不同源。
同源策略有什么用?
如果你剛剛在網(wǎng)銀輸入賬號(hào)密碼,查看了自己還有一萬(wàn) 元塊錢(qián),緊接著訪(fǎng)問(wèn)一些不規(guī)矩的網(wǎng)站,這個(gè)網(wǎng)站可以訪(fǎng)問(wèn)剛剛的網(wǎng)銀站點(diǎn),并且獲取賬號(hào)密碼,那后果可想而知。所以,從安全的角度來(lái)講,同源策略是有利于保護(hù)網(wǎng)站信息的。
ajax跨域解決方案
有一些情況下,我們是需要使用ajax進(jìn)行跨域訪(fǎng)問(wèn)的。比如某公司的a頁(yè)面(a.aresourse.com
)有可能需要獲取b頁(yè)面(b.bresourse.com
)。
方案一、設(shè)置響應(yīng)頭
核心原理:跨域訪(fǎng)問(wèn)的資源允許你跨域訪(fǎng)問(wèn)。(被調(diào)用方允許你可跨域訪(fǎng)問(wèn))
實(shí)現(xiàn):
response.setheader("access-control-allow-origin","http://localhost:8080/ajax/ajax7.html");//允許某個(gè) response.setheader("access-control-allow-origin","*");//允許所有
方案二、jsonp
jsonp:json with padding
jsonp
不是一個(gè)真正的ajax
請(qǐng)求。只不過(guò)可以完成ajax
的局部刷新效果。可以說(shuō)jsonp
是一種類(lèi)ajax
請(qǐng)求的機(jī)制。
jsonp
可以解決跨域問(wèn)題。
注意:jsonp
解決跨域的時(shí)候,只支持get
請(qǐng)求。不支持post
請(qǐng)求。這是因?yàn)?code>jsonp本就是動(dòng)態(tài)的創(chuàng)建script
標(biāo)簽從而達(dá)到跨域的效果。
下面是動(dòng)態(tài)創(chuàng)建的代碼:
效果展示:
jquery
封裝了jsonp
,也就是說(shuō)可以使用jquery
庫(kù)去進(jìn)行編寫(xiě)jsonp
代碼,方便。
核心代碼如下:
$.ajax({ type:"get", url:"跨域的url", datatype:"jsonp", //指定數(shù)據(jù)類(lèi)型 jsonp:"fun", //指定參數(shù)名(不設(shè)置的時(shí)候,默認(rèn)是”callback“) jsonpcallback:"sayhello" //指定回調(diào)函數(shù)的名字,不設(shè)置的時(shí)候,jquery會(huì)自動(dòng)生成一個(gè)隨機(jī)的回調(diào)函數(shù), //并且這個(gè)回調(diào)函數(shù)還會(huì)自動(dòng)調(diào)用success的回調(diào)函數(shù) })
方案三、代理機(jī)制(httpclient)
“調(diào)用方”解決跨域的問(wèn)題是這個(gè)思路的:讓發(fā)送出去的請(qǐng)求代理成是本域的。
如果資源是本域的,那就側(cè)面地進(jìn)行了跨域。
使用java程序怎么去發(fā)送get/post
請(qǐng)求呢?【get和post請(qǐng)求就是http請(qǐng)求】
- 使用
jdk
內(nèi)置的api
(java.net.url....
),這些api
是可以發(fā)送http
請(qǐng)求的。 - 使用第三方的開(kāi)源組件,比如:
apache
的httpclient
組件。(httpclient
組件是開(kāi)源免費(fèi)的,可以直接用)。
總結(jié)
到此這篇關(guān)于ajax的跨域問(wèn)題解決的文章就介紹到這了,更多相關(guān)ajax跨域問(wèn)題內(nèi)容請(qǐng)搜索碩編程以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持碩編程!