天天看點

處理一次模拟登入問題

主系統是需要使用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 屬性。

處理一次模拟登入問題

2、在頁面上增加以下代碼,可控制第三方頁面通過iframe内嵌

if (top.location != self.location) {top.location=self.location;}      

3、使用ajax ,配置dataType="jsonp",解決主流浏覽器的跨域資料通路的問題,隻能使用get請求。