怎样实现同一个用户在两个地方java 登陆功能的实现

如何实现用户登陆唯一性 - ITeye问答
Struts JSP 技术
怎样实现admin在某处登录状态下,别人无法再以admin登录的效果。
你可以这么干 1.在表结构里新增一个用户状态标示,当用户登录的时候,首先查看用户的当前处于什么状态,如果是未登录状态,直接允许其登录,如果是登录状态要求其验证登录信息
2.新增一个数据结构( 表或者其他什么),跟踪当前用户,包括其浏览记录,操作记录等,记得要要记录请求来源及时间,通过监控程序计算最后一次操作时间判断用户是否失效,譬如:半小时或者1小时后,你检查到该用户未有任何操作,即可把其设置成未登录状态,或者要求其重新登录。如果在登录状态用户从不地方又登录上来,就验证其登录信息,验证正确,注销其另一处登录信息,重新设置登录信息;如果登录信息已失效,则直接登录
3.针对关闭浏览器和退出系统及用户离开本网站页面做监控,一旦其离开就直接注销其登录信息,再打开时,要求其登录
大致可以这样写 每次请求时 把最后操作时间写入数据库& 如果长时间没操作 session就会失效& 如果当前时间减去最后操作时间大于 session的有效时间时就把状态 改为未登录吧
单独写个线程去监听admin的状态吧
局域网内的IP 访问的时候是不是同一个
在用户表里增加个存放session的字段,用户登录时候,更新该用户的session(用户名+18位随机数),将(用户名+18位随机数)存放到session里,在拦截器里查找该用户数据库中的session字段,判断是否和session里的一致,不一致就提示“该用户在其他地方登录了”。
用户登陆唯一性应用是后一个登录用户踢出前一个登录用户。
实现思路:
一、开发一个用户的心跳接口,用户作任何操作之前都必须作用户心跳。
二、后一个用户登录之后,前一个登录用户的心跳让它失败,心跳失败则提示:“您被强下线啦。”
看了前面的所有回答,其实都存在问题。
本人做过账号唯一登录的,实际上这个并不能完全做到。做的不好会影响整个系统的session。如果仅仅是把登录账号放到session里面,然后下次登录判断session.get返回的永远是null。如果监听浏览器关闭,实际上也无法完全监听到。如果采用onunload,那么浏览器刷新、关闭、kill ie进程都可触发,如果监听close,那么kill ie进程就无法监听到。spring security虽然提供max-sessions进行配置,实际上也是无法做到唯一登录的,因为关闭IE时,spring security根本无法知道。
如果采用集群的架构,这方面就更复杂了。
实际上银行的网银系统都没有做账号唯一登录。
用户表弄一个验证字段,然后弄个全局filter,每次访问都要查询一下这个验证字段,该验证字段的组,固定长度随机字符+ip地址,每次登陆操作就重新生成一次,这样就保证只能一个人操作一个账户.
补充一点
session监听在失效时remove掉application里的admin登录信息时需要做判断,避免误删。session要是当前admin登录的session才可以删。
回leonayx123
不点注销,等session失效,是否有些烦人。
有这样一种情况,在同一台机子上,admin用户直接关闭浏览器,然后突然间发现还有未完成的事需要重新登录进去,但是此时session还是有效,admin用户还需要等待一个session的周期的时间,这样是不是有些烦。
你这种担心也可以用session监听用于在失效时remove掉application里的admin登录信息。
为了防止我上面说的那种场景,可以检查IP,如果与前一次登录同一IP则允许admin登录并覆盖前一次登录。
我的一点想法,欢迎讨论。
..千万不能放在application里。。一忘记remove。。就oom了。
正常的做法是登录后 为一个用户生成token。存数据库。用户登录时去匹配当前用户在库里有没有token。 用户点注销,则移除token。
难点就是 如何在不点注销的情况下移除数据库里的数据。需要注册一个监听器。session失效,由监听器去做操作。
把第一次admin登录的信息保存在application里,同时也保存其session会话的引用。在别外地方登录时查看application里是否已经有admin登录,如果有则不允许,但是为了防止前一次admin退出时是直接关闭浏览器的做法而不是销毁session,所以也要判断力一下前一次登录的session的最后活动时间,再比较一下现在的时间,如果时间差超出一定的时间(多少合理自己定)就认为是非正常退出(不是点击“退出”键退出),那么允许admin登录,并覆盖之前的admin登录信息,使前一次登录下线(销毁前一次session)。
admin只有一个用户吧,保存在application也不会耗多少资源,也不需要在数据库里保存。只需要保存admin用户信息及session信息就可以了,在admin登录时检查这两项就够了,当然,做得更好一点,也可以加上IP的检查。
如果只是判断一个用户的话,就如你所说admin,那么放在application中是最好的,因为只是一个用户信息,数据量不是很大。但是存放的时候要注意,用户信息放在第一次登陆的session中,然后将session的标识放在application中,当session失效时,要有一个listen来清楚application中的session标识,注意这个标识是唯一的。这样的话,当别人使用admin来登陆的时候,就可以从application中找到已经登陆的session标识,提示不可以再登陆,这样也能防止第一个登陆的人浏览器非正常关闭引起的问题。
如果是所有的用户都需要唯一地点登陆的话,就需要使用数据库或者缓存机制了。数据库的话可以使用用户表中的标识位,不过这种方式会频繁的查询数据库,缓存机制的话就比较好一点,可以使用应用的内存空间,也可以使用专门的缓存的内存空间,比如说membercache之类的缓存机制,这些都需要session有一个监听,用来监听session失效,当session失效时清楚缓存中的用户信息。
以上是我的想法,当然会有更好的,希望大家提供!
为什么放在session中呢?session的作用范围是跟用户相关的不是全局的,前面几个建议放在session中的是不是搞错了?
应该放在application对象中,jkxydp 同学说的有点靠谱。另外要注意的是如果用户直接闭关浏览器而不是点击你的“退出”这种场景如何注销session
还是 判断登陆名SESSION吧。比如当用户xiaoA 登陆 将 xiaoA 放入session中 值为true 当 在登陆的时候 判断session.get下 ("xiaoA") 看是否为空。如果不为空 则 提示无法登陆 如果在没有其他框架 支持下 可以考虑下
1、内存中缓存用户id与session的map&用户key,sessinId&
2、写sessionListener实现类,检测session的创建与失效,在失效时,需遍历缓存map的内容,对缓存数据及时更新
3、登陆时判断map中是否存用户key,如果不存在登陆成功后,把用户key,sessionId放入session中
springSecurity可以通过配置max-sessions 实现:
&session-management&
&concurrency-control max-sessions="1" expired-url="/default.go" /&
&/session-management&
将已登陆的用户构建一个hashMap& key 为用户名,存放到application范围,在每次客户端有登陆用户的时候,就去application中取出hashMap,来检查用户名对应的key是否存在,这个过程执行效率极高,不存在证明没有在线,存在则证明在线。
注意几点:
1、用户登陆时,session中需要记录用户信息,并将登陆的用户添加到application的hashMap中;
2、session被销毁时,需要将hashMap中对应的用户名移除,以避免用户没有正常退出就永久不能登陆;
3、应该提供用户显示退出接口,当用户单击退出或者关闭浏览器时,注销用户信息。
在admin对象的表中添加一个字段用来表示当前用户是否已经登录,登录时候判断这个标识为没有登录状态才能允许登录,[size=x-small][/size]在第一个人用admin账号登录时候把标识改为已经登录,这样第二个人在第一个人admin账号没有退出的情况下,再登录就不能登录成功了。
这里要注意用户没有点击系统退出直接关闭浏览器。这种情况下,添加一个session监听器,在sesion销毁时候,把登录用户的数据库信息改成没有登录状态。还有个问题就是,在用户关闭浏览器,服务端的session还没有超时,而你把web容器,如tomcat关闭了。那么数据库中就会存在用户没有登录,但是他的状态时已经登录的情况。 这里最好是web容器启动的时候把所有的用户状态改为未登录。
打这么多不容易, 求采纳
支持Java_大猫
悲观锁???
springSecurity有防止一个账号重复登陆的功能。
这个是唯一登陆,不是单点登陆
上面说的有些问题,要是用户不是正常关闭的游览器,那不是自己都登陆不了了
首先记录登陆的ip,相同的则没有问题,ip不同的重新登陆,并放入session中
这个你可以研究下单点登录
/huc87/archive//1551398.html
数据库 做标志位 字段。每次判断 先查看下用户是否登陆。
比如: isLogin :0为未登录。1为已登录。不过这样 需要监听浏览器关闭。
用登录后放入session,从session中检查该用户是否已登录,如果已经登录,则返回错误信息,禁止登录。
已解决问题
未解决问题查看:8080|回复:7
怎么设置一台服务器能同时登陆多个域用户,比如在某AD域内的一台10.10.10.1服务器,现在想让4个或者更多的域用户同时登陆这台服务器进行操作,请哪位大师指点指点,小弟倍是感激,谢谢!
初级工程师
你指的是遠程還是本地呢?
童工!我只是一個童工!
引用:原帖由 yuandeman 于
15:15 发表
你指的是遠程還是本地呢? 远程登陆
优秀技术经理
在线云服务-您身边的IT专家团 ...
08的系统的话可以参考下:
在线云服务--您身边的IT专家团--
社区微软技术超级群-
引用:原帖由 IT之梦 于
19:58 发表
08的系统的话可以参考下:/thread-.html 感谢 我去试试,若有什么不明白的地方再回来找兄弟您
引用:原帖由 IT之梦 于
19:58 发表
08的系统的话可以参考下:/thread-.html 我是在域中&&你那个篇文章好像不是在域的情况下吧
引用:原帖由 Orchid420 于
15:14 发表
怎么设置一台服务器能同时登陆多个域用户,比如在某AD域内的一台10.10.10.1服务器,现在想让4个或者更多的域用户同时登陆这台服务器进行操作,请哪位大师指点指点,小弟倍是感激,谢谢! ... 楼主,你的服务器是做什么应用?
引用:原帖由 lzy821218 于
10:07 发表
楼主,你的服务器是做什么应用? 托管在机房里的服务器 里边有IISwebsite和其它一些其它应用,另外数据库服务器只能从这服务器登陆进去,所以登陆的人会较多点
本帖最后由 Orchid420 于
11:35 编辑
Copyright&
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:ASP.NET &&&&最新内容
ASP.NET &&&&随机内容

我要回帖

更多关于 h5 实现简单用户登陆 的文章

 

随机推荐