单点登录问题

cs_kill_you 2008-07-10 10:18:24
今天我去面试的时候,面试官问我,怎样解决一个单点问题,也就是在B/S结构中,在后的的登录中,一个帐户只能在一处地方登录,就像QQ的登录那样。我说是在数据库中设置一个标志位,他说,不用这个方法又怎么实现,谁知道啊,帮我解答一下,谢谢了。
...全文
3333 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymajicword 2010-09-27
  • 打赏
  • 举报
回复
学习中
shiaisun 2010-09-13
  • 打赏
  • 举报
回复
研究中
java_sick 2010-09-01
  • 打赏
  • 举报
回复
学习。。。。
Sharesin 2010-08-31
  • 打赏
  • 举报
回复
研究中。。。。
apccpa 2010-08-29
  • 打赏
  • 举报
回复
学习中。。。。。。。。。
baolj1988 2010-07-29
  • 打赏
  • 举报
回复
学习中。。。。。。。。。
aimyray 2010-07-09
  • 打赏
  • 举报
回复
我也在做,可以一起学习
didoleo 2008-08-03
  • 打赏
  • 举报
回复
需要一个统一认证服务,比如可以用windows的AD,或者其他的目录服务,(符合LDAP协议)。
qq379948396 2008-08-03
  • 打赏
  • 举报
回复
不明白啊,能不能讲清楚点实现单点登陆的方式和方法 啊
Dave 2008-08-03
  • 打赏
  • 举报
回复
学习
cs_kill_you 2008-08-03
  • 打赏
  • 举报
回复
在感谢大家了
zapchenda 2008-07-29
  • 打赏
  • 举报
回复
首先更正一下,楼主提的不叫单点登录,单点登录大致意思是在所有的系统中可以用唯一的用户id来登录。通常我们可以采用域服务器来实现。
andycpp 2008-07-27
  • 打赏
  • 举报
回复
mark
老紫竹 2008-07-27
  • 打赏
  • 举报
回复
上面的是不允许第二个登录,这个是第二个登录替换掉第一个。
if(isLogin()){
if(exists(username)){
setLastSessionId();
setLastAccessDatetime();
}else{
createNewAccount();
}
}else if(isNormalOperate()){
if(isExpired()){
logout();
}else if(currentSessionId != User.lastSessionId){
logout();
}
}
老紫竹 2008-07-27
  • 打赏
  • 举报
回复
可以用application保存用户信息实现
用户信息包括:用户名,最后登录的sessionId,最后操作时间
保存的key有2个
application.setAttribute(username,User);
application.setAttribute(sessionId,User);
新用户登录,检查用户名是否已经在application里面,如果在,则检查日期是否已经超过设置的超时时间。
如果成功,则设置User里面的最后sessionId为当前的。
老用户,则检查sessionID对应的User里面的sessionId是否为当前,如果不等则强制退出。
退出登录,则清理掉2个属性
系统用一个线程,定期清理无用的username和sessionId的数据,避免垃圾数据占用内存。
rcom10002 2008-07-27
  • 打赏
  • 举报
回复
SSO - Single Sign On - The objective of SSO is to allow users access to all applications from one logon.

1.单点登录的概念
http://www-128.ibm.com/developerworks/cn/security/se-sso/index.html
2.耶鲁大学开源实现
http://www.ibm.com/developerworks/web/library/wa-singlesign/
3.利用Sun包的实现
http://www.ibm.com/developerworks/java/library/j-gss-sso/
4.老外一实现单点登录的教程
http://www.developertutorials.com/tutorials/java/single-sign-on/page1.html

关于楼主的单用户在线处理方案:
我的实现方案是做一个全局的在线用户管理模块(起名叫OUMM - Online-User Management Module)
该模块作用是提供一个在线用户列表服务,其中"用户名+session id"为key,假定用户名全局唯一,value是“一个优先级+最后一次发送请求的时间”
当用户X第一次登录时,X信息被记录,优先级别为0
当另外一个X成功登录时,向OUMM中再添加一个X信息,设置优先级别为1(以后登录的用户优先级依次增加),同时提醒用户要采用的登录方案

方案一:不登录,直接退出
更新OUMM中的用户信息,将当前X的信息删除

方案二:继续登录,与之前的用户同时存在
直接进入系统,这时OUMM中用户信息就有两个,优先级别分别为0和1,后续登录者优先级2、3、4……

方案三:继续登录,将之前的用户踢出系统
OUMM中之前已经登录的X用户优先级别设置为-1,并把自己的优先级别设置为之前X用户的优先级别0
如果在本次登录之前有N个登录用户,把他们的优先级别都设置为-1

对于优先级别为-1的用户,当他们再次发请求时,告诉他们别人已经在别处登录,他已被强迫下线,可以让他们再次登录,同时删除OUMM中的用户信息

如果这两个X用户反复登录,就跟QQ被盗时效果一样,反复登录,反复被强迫下线

PS:
1.在用户关闭浏览器或退出系统时,使用AJAX发送请求到服务器端,删除当前用户的登录信息
2.OUMM的用户管理列表要做周期性的整理,将最后一次发送请求的时间与当前时间的差值,与服务器SESSION过期时间比较,删除那些已经超时的用户信息
qfs_v 2008-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jishu_vip 的回复:]
引用 3 楼 qfs_v 的回复:
在B/S结构中,使用单例模式维护用户列表,如果用户列表中存在该用户,那该用户的所有登陆请求被拒绝。


想了解一下,这个是怎么做到的?


暂时想的很楼主一样,数据库设置一个标志位。或则做登录日志。
[/Quote]

在B/S结构中 单例模式的维护是很麻烦的事情。至于怎么实现的你就把他当作 全局可见的变量维护用户列表来就可以了。
lizejia01 2008-07-24
  • 打赏
  • 举报
回复
学习!
jishu_vip 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qfs_v 的回复:]
在B/S结构中,使用单例模式维护用户列表,如果用户列表中存在该用户,那该用户的所有登陆请求被拒绝。
[/Quote]

想了解一下,这个是怎么做到的?


暂时想的很楼主一样,数据库设置一个标志位。或则做登录日志。
bxxkbxxk 2008-07-24
  • 打赏
  • 举报
回复
楼主明白什么叫单点登录么?
加载更多回复(2)

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧