java如何实现登录唯一性?

sinat_33362535 2017-03-28 08:57:25
现在小生想做的一个功能是,登录时判断这个账号是否已经被登录了,如果被登录了,后者强行踢前者下线。类似QQ的功能。希望各路大神支支招,小生感激不尽
...全文
2493 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiejin90314 2017-04-27
  • 打赏
  • 举报
回复
引用 19 楼 xj90314 的回复:
把用户登录后产生的Token存到数据库或者第三方缓存中去。表大致结构有userId和Token 同一个用户每次登录都产生新的Token。如果表的userId存在数据 直接更新Token, 然后在登录的时候把Token存在session中,做一个拦截器,每次请求的时候验证这个Token是不是在数据库是不是存在。如果存在表示可用,如果不存在可能是已经帐号已经在其他地方登录过了,然后让他重新登录。 其实就是单点登录的问题,大概就是这么一个原理,具体细节需要自己设计了
防歧义哦 补了一句 见红色部分
xiejin90314 2017-04-27
  • 打赏
  • 举报
回复
把用户登录后产生的Token存到数据库或者第三方缓存中去。表大致结构有userId和Token 每次登录都产生新的Token。如果表的userId存在数据 直接更新Token, 然后在登录的时候把Token存在session中,做一个拦截器,每次请求的时候验证这个Token是不是在数据库是不是存在。如果存在表示可用,如果不存在可能是已经帐号已经在其他地方登录过了,然后让他重新登录。 其实就是单点登录的问题,大概就是这么一个原理,具体细节需要自己设计了
110成成 2017-04-25
  • 打赏
  • 举报
回复
websocket应该可以,主要是在服务端主动推送。
  • 打赏
  • 举报
回复
引用 16 楼 jam_show 的回复:
谁能告诉我为什么session不行啊,我一直这样做的诶。
你这么做没问题? 233333333333
绝望的奶黄包 2017-04-21
  • 打赏
  • 举报
回复
谁能告诉我为什么session不行啊,我一直这样做的诶。
GetIndex 2017-04-21
  • 打赏
  • 举报
回复
建立一个缓存对象 HashMap 其中储存用户名为key , App端唯一表示为value (每个App都有一个唯一标识,让他们带过来) 每次访问都把AppKey 带过来 跟当前储存的进行校验,如果不正确则返回被顶用信息 如果HashMap 对应的值为空则设置本次的值进去。 在登录接口不进行校验,直接设置进去。
  • 打赏
  • 举报
回复
session的方式不行,因为每个用户登录都会有session; 存数据库的方式也不行,因为登录的时候可以存入数据库,但是登出的时候必须点击某个按钮才能存入数据库,大部分用户都是直接关闭或者×关闭,这样就没有办法把登出存入数据库,也就没有办法再下个用户登录的时候去抓取数据; 可以看看6楼链接中的方法。
小灰狼 2017-03-30
  • 打赏
  • 举报
回复
后登录的踢前面登录的,可以这么做 1、登录信息放到 session 中,再创建一个数据结构(通常是单例模式下的某种管理器),提供登录信息的 key/value 管理,以 UserId 为 Key,Session 为 Value,大概是: public class SessionManager { private Map<Integer, HttpSession> sessions = new TreeMap<Integer, HttpSession>(); public void login(Integer userId, HttpSession session){ HttpSession oldSession = sessions.get(userId); if(oldSession != null) oldSession.abandom(); sessions.put(userId, session); } pulbic void logout(Integer userId){ sessions.remove(userId); } public static final SessionManager Instance = new SessionManager(); private SessionManager(){ } } 2、当登录成功时,调用 SessionManager.Instance.login(userId, session); 3、写一个 session 过滤器,当 session 过期时,调用 SessionManager.Instance.logout(userId)
树成 2017-03-29
  • 打赏
  • 举报
回复
不过强制退出是推送功能,比较麻烦。
树成 2017-03-29
  • 打赏
  • 举报
回复
你可以把登陆信息存放在数据库或者某个公共缓存中。session是不能用的
树成 2017-03-29
  • 打赏
  • 举报
回复
引用 1楼qq_36142091 的回复:
登录之后 把登录的对象放在session中,然后在登录的时候 获取一下session中的对象,如果对象为空,执行登录操作,如果不等于空,把session中的对象移除 再执行登录操作
你这么做实现不了这个功能。
湖北wh 2017-03-29
  • 打赏
  • 举报
回复
引用 4 楼 spiniper 的回复:
不过强制退出是推送功能,比较麻烦。
你意思直接存库里面 登录之前拦截匹配吗?
a461666405 2017-03-29
  • 打赏
  • 举报
回复
前后端分离的restful中好像很多在用token来验证状态吧? 登录成功时给你一个32位类似密码的东西,你的下次请求就带上这个密码证明你自己的身份。 服务器响应时会再分配你一个新的token。给你接下来的请求使用。 如果这样在回到问题。登录唯一? 就写成登录时重新分配token就好了,拿着之前token的就没权限了。
湖北wh 2017-03-29
  • 打赏
  • 举报
回复
要是用户非法关闭的话 还登的上去吗?
丶瓦力 2017-03-29
  • 打赏
  • 举报
回复
session存用户名,application存sessionId和用户名,用户登录时候监听一下,然后取到sessionId,找到对应的session,清空,然后再登录
湖北wh 2017-03-29
  • 打赏
  • 举报
回复
我也在在做这个,楼主有好的办法没有?
大鱼> 2017-03-29
  • 打赏
  • 举报
回复
这种应该是后台来控制稍微简单些,用户登录后台会有记录在线状态
ja_rome 2017-03-29
  • 打赏
  • 举报
回复
我现在的项目就有这样的功能,项目集成了shior 然后看了开涛的博客,运用了开涛的示例,建议楼主也去看看 http://jinnianshilongnian.iteye.com/blog/2039760
faneok 2017-03-29
  • 打赏
  • 举报
回复
Shiro权限控制
qq_36142091 2017-03-28
  • 打赏
  • 举报
回复
登录之后 把登录的对象放在session中,然后在登录的时候 获取一下session中的对象,如果对象为空,执行登录操作,如果不等于空,把session中的对象移除 再执行登录操作

81,091

社区成员

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

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