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

簡述

本文僅記錄如標題所述場景的測試所得,因爲場景有些特殊,且並不需兼容全部瀏覽器,因此本文的內容對讀者也許並沒有做用,僅爲記錄。ajax

場景、與實現

  • 需在移動端單點登陸
  • 需在移動端跨域訪問咱們的服務

基於歷史緣由:跨域

  • 單點登陸驗證後,如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項目
測試結果:post

  • 在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跨域。url

相關文章
相關標籤/搜索