如何用Java实现用户登录安全问题

youxi520131420 2010-05-25 11:30:40
我想实现一个功能,就是我的页面登录后,如果用户在另一个地方登录了,在这边会提示说“用户已经在别的地方登录”,然后在边被强制退出,请问该怎么实现(我是用JSP的)?就类似QQ,你的用户在别的地方登录,你就会下线,应该怎么做呢?
还有就是:如果一个用户如果连续三次密码输入错误,就要锁定该用户15分钟内不得登录,15分钟后自动解锁,请详细说一下该如何解决这两个问题,给个例子让我看一下,谢谢了!
...全文
1180 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang6953317 2012-10-18
  • 打赏
  • 举报
回复
不能用SESSION吧。 我觉得应该用上下文才行吧。
zuxianghuang 2012-10-18
  • 打赏
  • 举报
回复
spring-security很好实现
最美的词 2012-10-18
  • 打赏
  • 举报
回复
1楼的仁兄说的方法可以解决,lz不妨参考
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

具体代码不用写了吧?呵呵!
不过,原理可以说一下,就通过session控制就好了,session里定义变量就可以了!第一个,一旦登录过了,一个boolean变量已经true了,自然就知道了!呵呵!
另一个,一样是在session里定义一个变量计数就可以了,呵呵!最简单就是这样了!
[/Quote]
仁兄考虑不周全,session存单点登录是不正确的,比较常用的是session与application结合使用,通过session获取与用户唯一性关联的sessionID(比如userid),存入application,以后比较的是application中有没有已经有的sessionID,详细见http://blog.csdn.net/itbasketplayer/article/details/8014727。
第二个的前提是用户名必须唯一,因为要以用户名锁定账户,你不能锁定跟你一样用户名的用户(所以很多系统都规定用户名必须唯一),然后是登录次数变量及登录时间必须记录在application中!
楼上的也说了,b/s模式没有办法,只能取最好的实现而不能完全媲美c/s模式下的这种实现。session不是万能的,也不是服务器可控的,而application才是服务器可控对象。
yrsheng 2012-10-17
  • 打赏
  • 举报
回复
前面有人说保存session就可以了?那重启浏览器、换一台机就解除锁定了?
定时器可以不要,但登录错误次数必须保存,还要有账号是否锁定标志。
关键我是洛哥 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
关于强制下线问题:建立一个全局的Map
1.验证登陆 验证成功 判断用户是否在Map中
---如果不在Map中 将该用户名和session放到Map中
---如果在Map中 将session取出置为非法session ,将新session放入Map中

至于提醒 : 可以用Ajax 不过有点麻烦
[/Quote]
关于用户输入密码错误问题可以提供一个解决方案:
第一次登陆时不用验证码 如果登陆出错 继续登陆就用户输入验证码
这样做有两个原因:1.如果是人为登陆 他就算是在试探密码 给出 输入也很慢 用户账户是安全的
2.如果是恶意程序 它不能识别验证码 用户账户是安全的

所以这个方案是很好的解决方案
关键我是洛哥 2012-10-17
  • 打赏
  • 举报
回复
关于强制下线问题:建立一个全局的Map
1.验证登陆 验证成功 判断用户是否在Map中
---如果不在Map中 将该用户名和session放到Map中
---如果在Map中 将session取出置为非法session ,将新session放入Map中

至于提醒 : 可以用Ajax 不过有点麻烦
宁波朱超 2012-10-17
  • 打赏
  • 举报
回复
常用做法是SESSION对输入的账户计数。
sgyyz 2012-07-04
  • 打赏
  • 举报
回复
session判断,正解……
lele140 2010-05-28
  • 打赏
  • 举报
回复
个人感觉 4 楼的大哥说的比较好,赞同一下。期待高手的回答。。。。
x_pengcheng 2010-05-25
  • 打赏
  • 举报
回复
学习。
  • 打赏
  • 举报
回复
单点登录 CAS
http://www.blogjava.net/xcp/archive/2010/04/13/318122.html
fossette 2010-05-25
  • 打赏
  • 举报
回复
study
phoenixYiYou 2010-05-25
  • 打赏
  • 举报
回复
具体代码不用写了吧?呵呵!
不过,原理可以说一下,就通过session控制就好了,session里定义变量就可以了!第一个,一旦登录过了,一个boolean变量已经true了,自然就知道了!呵呵!
另一个,一样是在session里定义一个变量计数就可以了,呵呵!最简单就是这样了!
Jay_+wqq_635731323 2010-05-25
  • 打赏
  • 举报
回复
这个问题不错,学习中
stl0 2010-05-25
  • 打赏
  • 举报
回复
to beblong:第一个问题,我认为没有必要设置定时器,当后者在其他地方登陆后,前者继续操作(request)的时候,进行判断就可以了啊
焙焙龙 2010-05-25
  • 打赏
  • 举报
回复
第一个问题,由于BS结构的特点是基于请求和应答的,换句话说,服务器处于被动位置,客户浏览器处于主动为止,如果你不主动发出请求,服务器是不会鸟你的,或者说,服务器根本就不知道你是谁!
要想实现你的需求,可以在JSP页面放置一个定时器,用JavaScript搞,通过Ajax异步请求服务器,做登录状态轮询,如果发现在别的地方登录了,强制下线。
这样的话,就需要一个状态保存的容器,这个自己去搞吧,实现方案很多的。

第2个问题就更简单了,登录失败时,修改计数器的值,例如设置为错误3次就锁定,那么没错误一次就减1,到0就不让登了呗,然后启动一个解锁定时器线程,在设定的时间后将这个值修改成3
这些参数都是可以人为设定的

我就讲到这,其余的你自己自由发挥吧

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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