主系統是需要使用chrome浏覽器,并且在70及以上的版本,內建的第三方系統登入,需要在IE7、IE8上運作。在chrome上點選第三方系統圖示時,需要使用一個插件喚起IE浏覽器,主系統開發了一個form表單,模拟送出登入第三方系統。但是第三方系統有校驗,通路第三方系統時,需要在頁面上攜帶一個cookie,并且這個cookie是通過通路第三方系統登入頁面産生。
一、使用iframe加載
在主系統的頁面,使用iframe內建第三系統的登入位址,在頁面加載時産生cookie。然後一秒後,模拟送出form表單,登入第三方系統。但是第三方系統登入頁面有校驗
if (top.location != self.location) {top.location=self.location;}
自動判斷目前的location是否是頂層的,即是否被嵌套到iframe裡面了,如果是,則強制跳轉,此場景無法使用模拟登入。通過研究發現在iframe中增加sandbox=""屬性,可禁止iframe的跳轉。
<iframe src="" class="iframe" scrolling="no" sandbox="">
二、sandbox在IE8上不生效
增加屬性後在IE11上,模拟登入的頁面,不會被第三方系統覆寫,模拟登入成功。但是在IE8上,仍然會被覆寫,增加屬性不生效。
三、使用ajax模拟通路
在頁面上使用ajax通路第三方系統登入頁,産生cookie後,再模拟登入。設定ajax同步通路模式,先通路第三方系統登陸頁面,然後模拟送出。使用ajax後,發現跨域問題,無法正常使用ajax通路第三方系統登陸頁面,問題依然無法解決。
四、ajax設定jsonp
ajax設定使用jsonp模式,解決跨域通路問題。使用jsonp模式後,可正常擷取cookie,延時一秒,模拟送出form表單,可正常登入跳轉第三方系統。
$.ajax({
url:srcUrl,
type:'get',
dataType: "jsonp",
success: function(data){
}
});
五、<script>标簽
應該有更簡單的方法,使用<script>标簽的src屬性
六、總結
1、在本次解決問題過程中,了解到 <iframe>的sandbox=""屬性,sandbox 屬性将會啟用一系列對行内架構中内容的額外限制。IE 9 以及更早的版本不支援 sandbox 屬性。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SYkJ2MjRGOjRWNmdTY3ITYxMDN0ImZycTOiFDNlFTOj9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
2、在頁面上增加以下代碼,可控制第三方頁面通過iframe内嵌
if (top.location != self.location) {top.location=self.location;}
3、使用ajax ,配置dataType="jsonp",解決主流浏覽器的跨域資料通路的問題,隻能使用get請求。