簡述
本文僅記錄如标題所述場景的測試所得,由于場景有些特殊,且并不需相容所有浏覽器,是以本文的内容對讀者也許并無作用,僅為記錄。
場景、與實作
- 需在移動端單點登入
- 需在移動端跨域通路我們的服務
基于曆史原因:
- 單點登入驗證後,如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/
本部落格為學習、筆記之用,以筆記形式記錄學習的知識與感悟。學習過程中可能參考各種資料,如覺文中表述過分引用,請務必告知,以便迅速處理。如有錯漏,不吝賜教。
如果本文對您有用,
點贊或
評論哦;如果您喜歡我的文章,請點選
關注我哦~