简述
本文仅记录如标题所述场景的测试所得,由于场景有些特殊,且并不需兼容所有浏览器,所以本文的内容对读者也许并无作用,仅为记录。
场景、与实现
- 需在移动端单点登录
- 需在移动端跨域访问我们的服务
基于历史原因:
- 单点登录验证后,如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/
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,
点赞或
评论哦;如果您喜欢我的文章,请点击
关注我哦~