天天看點

CORS跨域、Cookie傳遞SessionID實作單點登入後的權限認證的移動端相容性測試報告

簡述

本文僅記錄如标題所述場景的測試所得,由于場景有些特殊,且并不需相容所有浏覽器,是以本文的内容對讀者也許并無作用,僅為記錄。

場景、與實作

  • 需在移動端單點登入
  • 需在移動端跨域通路我們的服務

基于曆史原因:

  • 單點登入驗證後,如Web網站一樣,用Cookie攜帶SessionID到伺服器,伺服器根據SessionID管理該使用者會話、權限
  • 跨域用CORS,在服務端和用戶端有如下設定。

服務端響應:

httpResponse.setHeader("Access-Control-Allow-Origin", "http://example.com:8080");
httpResponse.addHeader("Access-Control-Allow-Credentials", "true");
httpResponse.addHeader("Access-Control-Allow-Methods", "HEAD,POST,GET,PUT,DELETE,OPTIONS");
           

用戶端Ajax請求時設定

withCredentials

參數為

true

,記得傳回Cookie的首次請求和其它請求都需設定:

function login() {
    $.ajax({
        url : urlPrefix + "/LoginServlet",
        type : "post",
        xhrFields: {
            withCredentials : true
        },
        success : function(data, name) {
            alert(data)
        }
    });
}

function test() {
    $.ajax({
        url : urlPrefix + "/BusinessServlet",
        type : "post",
        xhrFields: {
            withCredentials : true
        },
        success : function(data, name) {
            alert(data)
        }
    });
}
           

問題

測試過程:

A項目部署在a機器,B項目部署在a機器,B項目的頁面跨域通路A項目

測試結果:

  • 在Web端驗證基本沒問題
  • 在移動端,IOS的Safari浏覽器需要在

    設定

    ->

    Safari

    阻止Cookie

    始終禁止

    才不能通過Cookie傳遞SessionID

A項目部署在a機器,B項目部署在b機器,B項目的頁面跨域通路A項目。

如果a機器和b機器同屬同一區域網路:

  • 設定

    Safari

    阻止Cookie

    始終允許

    允許通路過的網站

    僅允許目前網站

    能通過Cookie傳遞SessionID
  • 在移動端,我的IOS的QQ浏覽器沒問題

如果a機器和b機器其中之一屬于外網:

  • 設定

    Safari

    阻止Cookie

    始終允許

    才能通過Cookie傳遞SessionID
  • 在移動端,我的IOS的QQ浏覽器有問題

目前還沒探索出的原因,根據測試結果,可能會改為其它實作方法,比如單點登入後用JWT驗證會話,用JSONP跨域。

作者:Nick Huang 部落格:http://www.cnblogs.com/nick-huang/

本部落格為學習、筆記之用,以筆記形式記錄學習的知識與感悟。學習過程中可能參考各種資料,如覺文中表述過分引用,請務必告知,以便迅速處理。如有錯漏,不吝賜教。

如果本文對您有用,

點贊

評論

哦;如果您喜歡我的文章,請點選

關注我

哦~