需求:
A域有頁(yè)面a.html,其中有iframe包含B域的頁(yè)面b.html,現(xiàn)在要通過(guò)a.html上的一個(gè)按鈕,來(lái)把a(bǔ).html頁(yè)面上一個(gè)文本框的值傳遞到b.html頁(yè)面的文本框。
注:這里b.html是html網(wǎng)頁(yè),不能接收其他網(wǎng)站post過(guò)來(lái)的值,所以不能用直接post的方法來(lái)傳值,但是,如果接收頁(yè)面是b.aspx或者b.asp 呢,那不是可以直接post了么?答案是肯定的,確實(shí)可以,但是b.asp或b.aspx必須要刷新,才可以,如何能不刷新的動(dòng)態(tài)改變接收頁(yè)的元素或者值呢?(IE的本地項(xiàng)目是可以實(shí)現(xiàn)跨域訪問(wèn)的,但是外網(wǎng)的跨域訪問(wèn)默認(rèn)是被拒絕的。Firefox本地項(xiàng)目以及外網(wǎng)的跨域訪問(wèn)都是被拒絕的。)
原理:
瀏覽器禁止跨域數(shù)據(jù)訪問(wèn),但是瀏覽器并沒(méi)有禁止跨域跨框架的post傳值。我們可以在A域,post到B域的某個(gè)頁(yè)面的框架中,然后通過(guò)B域的框架頁(yè)來(lái)實(shí)現(xiàn)本域內(nèi)的數(shù)據(jù)訪問(wèn)。這其實(shí)是html應(yīng)用中的一個(gè)小技巧,并沒(méi)有用到其他高深的知識(shí)就實(shí)現(xiàn)了跨域的數(shù)據(jù)提交。
方法:
在B域中添加兩個(gè)頁(yè)面,來(lái)實(shí)現(xiàn)跨域的數(shù)據(jù)訪問(wèn),post.aspx和main.aspx。
頁(yè)面關(guān)系如下,A域的a.html包含一個(gè)框架,框架頁(yè)地址是B域的main.aspx,main.aspx是一個(gè)框架集包含兩個(gè)框架,(frmMain)b.html 和(frmPost)post.aspx.
A域的a.html:
<form action=" <input id="cmd" type="text" size="20"> <input type="submit"> </form> <iframe src="> B域的main.aspx: <frameset rows="*,0" frameborder="no" border="0" framespacing="0"> <frame src="b.html" name="frmMain"> <frame src="post.aspx" name="frmPost"> </frameset>   我們先把要傳遞到B域的數(shù)據(jù)保存到a.html的form中,然后post到B域的post.aspx. 這時(shí)post.aspx接收到值,然后執(zhí)行本域內(nèi)的父框架訪問(wèn)b.html。 string cmd = Request.Form["cmd"]; if (null != cmd && string.Empty != cmd) {         Response.Write("<script language=/"javaScript/" for=/"window/" event=/"onload/"> if (parent && parent.frames[/"frmMain/"]) { 這里添加控制b.html的執(zhí)行代碼} </script> "); } 不難發(fā)現(xiàn),這里利用跳躍跨frame(即中間躍過(guò)了一層frame)的方法,來(lái)實(shí)現(xiàn)跨域的數(shù)據(jù)訪問(wèn)。即post到frame的子frame里面。 后記: 這個(gè)例子不過(guò)是一些特殊的情況下跨域訪問(wèn)的解決方案,也許對(duì)你會(huì)有所幫助。因?yàn)榉椒ê?jiǎn)單,應(yīng)用也就有很多局限性。(不過(guò)偶倒是覺(jué)得這樣很象Ajax哦,頁(yè)面沒(méi)有刷新,同樣完成了一次服務(wù)端的數(shù)據(jù)處理^o^)。 相關(guān)網(wǎng)文資料: web應(yīng)用的跨域訪問(wèn)解決方案 做過(guò)跨越多個(gè)網(wǎng)站的Ajax開(kāi)發(fā)的朋友都知道,如果在A網(wǎng)站中,我們希望使用Ajax來(lái)獲得B網(wǎng)站中的特定內(nèi)容,如果A網(wǎng)站與B網(wǎng)站不在同一個(gè)域中,那么就出現(xiàn)了跨域訪問(wèn)問(wèn)題。Ajax的跨域訪問(wèn)問(wèn)題是現(xiàn)有的Ajax開(kāi)發(fā)人員比較常遇到的問(wèn)題。 IE對(duì)于跨域訪問(wèn)的處理是,彈出警告框,提醒用戶。如果用戶將該網(wǎng)站納入可信任網(wǎng)站,或者調(diào)低安全級(jí)別,那么這個(gè)問(wèn)題IE就不會(huì)在提醒你。 FireFox等其它非微軟的瀏覽器遇到跨域訪問(wèn),則解決方案統(tǒng)一是拒絕訪問(wèn)。 有人說(shuō),IE是主流瀏覽器,只要它能正常使用就好了。此言差已,IE雖然能夠處理,但是是有前提的,要么用戶不厭其煩地在頁(yè)面彈出警告框之后點(diǎn)擊是(點(diǎn)擊否就不執(zhí)行該Ajax調(diào)用了),要么用戶將該網(wǎng)站納入可信任站點(diǎn)。這兩種做法,在企業(yè)管理系統(tǒng)的應(yīng)用中倒是比較常見(jiàn),因?yàn)橄到y(tǒng)管理員可以以行政手段保證用戶的行為。但是對(duì)于互聯(lián)網(wǎng)上的網(wǎng)站或者門戶開(kāi)發(fā),這種做法則不行。 最近遇到了這個(gè)問(wèn)題,需要在跨域訪問(wèn)結(jié)束之后完成使主窗口出現(xiàn)一些特效,搜索了一些資料,通過(guò)不斷嘗試以及在不同瀏覽器中進(jìn)行兼容性測(cè)試,找到了幾個(gè)可行的方案: 1、Web代理的方式。即用戶訪問(wèn)A網(wǎng)站時(shí)所產(chǎn)生的對(duì)B網(wǎng)站的跨域訪問(wèn)請(qǐng)求均提交到A網(wǎng)站的指定頁(yè)面,由該頁(yè)面代替用戶頁(yè)面完成交互,從而返回合適的結(jié)果。此方案可以解決現(xiàn)階段所能夠想到的多數(shù)跨域訪問(wèn)問(wèn)題,但要求A網(wǎng)站提供Web代理的支持,因此A網(wǎng)站與B網(wǎng)站之間必須是緊密協(xié)作的,且每次交互過(guò)程,A網(wǎng)站的服務(wù)器負(fù)擔(dān)增加,且無(wú)法代用戶保存session狀態(tài)。 2、on-Demand方式。MYMSN的門戶就用的這種方式,不過(guò)MYMSN中不涉及跨域訪問(wèn)問(wèn)題。動(dòng)態(tài)控制script標(biāo)記的生成,通過(guò)修改script標(biāo)記的src屬性完成對(duì)跨域頁(yè)面的調(diào)用。此方案存在的缺陷是,script的src屬性完成該調(diào)用時(shí)采取的方式時(shí)get方式,如果請(qǐng)求時(shí)傳遞的字符串過(guò)大時(shí),可能會(huì)無(wú)法正常運(yùn)行。不過(guò)此方案非常適合聚合類門戶使用。 3、iframe方式。查看過(guò)醒來(lái)在javaeye上的一篇關(guān)于跨域訪問(wèn)的帖子,他提到自己已經(jīng)用iframe的方式解決了跨域訪問(wèn)問(wèn)題。數(shù)據(jù)提交跟獲取,采用iframe這種方式的確可以了,但由于父窗口與子窗口之間不能交互(跨域訪問(wèn)的情況下,這種交互被拒絕),因此無(wú)法完成對(duì)父窗口效果的影響。 (偶找到了該文,補(bǔ)充一下地址:http://www.javaeye.com/topic/15641) 4、用戶本地轉(zhuǎn)儲(chǔ)方式:IE本身依附于windows平臺(tái)的特性為我們提供了一種基于iframe,利用內(nèi)存來(lái)“繞行”的方案,即兩個(gè)window之間可以在客戶端通過(guò)windows剪貼板的方式進(jìn)行數(shù)據(jù)傳輸,只需要在接受數(shù)據(jù)的一方設(shè)置Interval進(jìn)行輪詢,獲得結(jié)果后清除Interval即可。FF的平臺(tái)獨(dú)立性決定了它不支持剪貼板這種方式,而以往版本的FF中存在的插件漏洞又被fixed了,所以FF無(wú)法通過(guò)內(nèi)存來(lái)完成暗渡陳倉(cāng)。而由于文件操作FF也沒(méi)有提供支持(無(wú)法通過(guò)Cookie跨域完成數(shù)據(jù)傳遞),致使這種技巧性的方式只能在IE中使用。 5、我自己用于解決這類問(wèn)題的方式:結(jié)合了前面幾種方式,在訪問(wèn)A網(wǎng)站時(shí),先請(qǐng)求B網(wǎng)站完成數(shù)據(jù)處理,再根據(jù)返回的標(biāo)識(shí)來(lái)獲得所需的結(jié)果。這種方法的缺點(diǎn)也很明顯,B網(wǎng)站的負(fù)載增大了。優(yōu)點(diǎn),對(duì)session也實(shí)現(xiàn)了保持,同時(shí)A網(wǎng)站與B網(wǎng)站頁(yè)面間的交互能力增強(qiáng)了。最重要的一點(diǎn),這種方案滿足了我的全部需要。 總結(jié)一下,以上方案中可選擇的情況下,我最推薦on-Demand方式,在不需要提交大量數(shù)據(jù)的情況下,這種方式能夠解決您的大部分問(wèn)題。 web應(yīng)用的跨域訪問(wèn)解決方案 地址:http://www.newbooks.com.cn/info/37166.html http://m.survivalescaperooms.com/lgamoy/archive/2006/11/23/569633.html
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注