簡述
本文僅記錄如標題所述場景的測試所得,由於場景有些特殊,且並不需兼容所有瀏覽器,所以本文的內容對讀者也許並無作用,僅為記錄。
場景、與實現
- 需在移動端單點登錄
- 需在移動端跨域訪問我們的服務
基於歷史原因:
- 單點登錄驗證后,如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跨域。