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機器同屬同一局域網:

  • 在Web端驗證基本沒問題
  • 在移動端,IOS的Safari瀏覽器需要在設置 -> Safari -> 阻止Cookie -> 始終允許允許訪問過的網站僅允許當前網站能通過Cookie傳遞SessionID
  • 在移動端,我的IOS的QQ瀏覽器沒問題

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

  • 在Web端驗證基本沒問題
  • 在移動端,IOS的Safari瀏覽器需要在設置 -> Safari -> 阻止Cookie -> 始終允許才能通過Cookie傳遞SessionID
  • 在移動端,我的IOS的QQ瀏覽器有問題

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM