摘要:由于瀏覽器同源策略,凡是發(fā)送請(qǐng)求的協(xié)議域名端口三者之間任意一與當(dāng)前頁面地址不同即為跨域最近項(xiàng)目要兼容,找了一些資料,實(shí)踐了一下,現(xiàn)在總結(jié)一下,避免以后踩坑。解決方案,微軟在和下給我們提供了來進(jìn)行解決跨域問題,官方的文檔可以在這里看到。
由于瀏覽器同源策略,凡是發(fā)送請(qǐng)求url的協(xié)議、域名、端口三者之間任意一與當(dāng)前頁面地址不同即為跨域
最近項(xiàng)目要兼容IE9,找了一些資料,實(shí)踐了一下,現(xiàn)在總結(jié)一下,避免以后踩坑。
普通請(qǐng)求的跨域 簡(jiǎn)單粗暴的解決方案第一次碰到這個(gè)問題,所以就是上網(wǎng)找找有沒有什么好的解決方案。最初找到的方案是這樣的,直接在IE中設(shè)置設(shè)置受信任的站點(diǎn),然后允許其可以進(jìn)行跨域訪問,最后在jQuery中設(shè)置開啟跨域請(qǐng)求。oh,No!這么粗暴,好吧,這也是一個(gè)不是辦法的辦法,如果做的是一個(gè)小項(xiàng)目,用戶不多,那直接寫在用戶手冊(cè)里,讓他們自己去配吧。但是,這顯然不是一個(gè)好的解決方案啊,那只能繼續(xù)找了。
XDomainRequest(XDR)解決方案ok,微軟在IE8和IE9下給我們提供了XDomainRequest來進(jìn)行解決跨域問題,官方的文檔可以在 這里看到。當(dāng)然Github上也有開源的jQuery插件,可以在這里找到。
XDR的限制:
XDR僅支持GET與POST這兩種請(qǐng)求方式,雖然可以使用上面提交的插件來解決前端部分只要進(jìn)行簡(jiǎn)單修改代碼就可以提交PUT/HEAD/DELETE的請(qǐng)求的問題,但是其請(qǐng)求的發(fā)生出去依舊還是將PUT/HEAD/DELETE轉(zhuǎn)化為POST,將HEAD 轉(zhuǎn)化為GET請(qǐng)求。當(dāng)是POST請(qǐng)求的時(shí)候,請(qǐng)求方案會(huì)以__method=原請(qǐng)求的方式結(jié)構(gòu)加入到請(qǐng)求體的body中。當(dāng)是HEAD 請(qǐng)求的時(shí)候,請(qǐng)求方案會(huì)以__method=原請(qǐng)求的方式結(jié)構(gòu)加入請(qǐng)求url的查詢參數(shù)中?,F(xiàn)在大部分API開發(fā)都是按照RESTful規(guī)范進(jìn)行設(shè)計(jì)的,如果是自己的服務(wù)端還好,可以叫服務(wù)端的同學(xué)添加一個(gè)攔截器做一個(gè)攔截判斷,然后執(zhí)行對(duì)應(yīng)的方法(ps:我想過去應(yīng)該是這個(gè)樣子,不知道服務(wù)端的同學(xué)會(huì)不會(huì)磨刀子)。但是如果你調(diào)用是網(wǎng)上的API的接口的話,那就愛莫能助了。
XDR不支持自定義的請(qǐng)求頭,因此如果你的服務(wù)端是用過header中的自定義參數(shù)進(jìn)行做身份驗(yàn)證的話,那也行不通了。
請(qǐng)求頭的Content-Type只允許設(shè)置為text/plain
XDR不允許跨協(xié)議的請(qǐng)求,如果你的網(wǎng)頁是在HTTP協(xié)議下,那么你只能請(qǐng)求HTTP協(xié)議下的接口,不能訪問HTTPS 下的接口。
XDR只接受HTTP/HTTPS 的請(qǐng)求
發(fā)起請(qǐng)求的時(shí)候,不會(huì)攜帶authentication 或 cookies
JSONPJSONP的本質(zhì)是動(dòng)態(tài)的加載