异地登录和再次登录挤下上一个登录者的问题

Mr_Hope 2016-11-02 05:52:53
新手求教一个问题,当我们在做登录的时候,怎样判断是异地登录,假如一人登录了,又怎样实现当第二人用同样账户登录的时候把第一个人挤下去0.0
...全文
715 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
aweizhiguo 2016-12-16
  • 打赏
  • 举报
回复
//判断是否重复登陆 if(SessionUserListener.checkIfHasLogin(user)){ if(this.sessionid.equals(request.getSession().getId())){ System.out.println("在本机已经有登录的用户了,确认再次登录吗?"); }else{ System.out.println("账号已在别处登录,修改密码!"); //return "updatePassWord"; } /* System.out.println(this.sessionid); System.out.println(request.getSession()); System.out.println(request.getSession().getId()); //测试结果是ip不同 session不同 SessionUserListener.removeSession(this.sessionid); // 如果没有重复登录,则将该登录的用户信息添加入session中 request.getSession().setAttribute("user", user); // 比较保存所有用户session的静态变量中,是否含有当前session的键值映射,如果含有就删除 if (SessionUserListener.containsKey(request.getSession().getId())) { SessionUserListener.removeSession(request.getSession().getId()); } //把当前用户封装的session按,sessionID和session进行键值封装,添加到静态变量map中。 SessionUserListener.addUserSession(request.getSession()); //如果强制登录 if(true){ //System.out.println("强踢下线,并修改密码"); SessionUserListener.removeUserSession(user.getAd_user_id()+""); //return "updatePassWord"; }*/ }else{ //System.out.println("首次登录"); //System.out.println(request.getSession()); this.sessionid = request.getSession().getId(); // 如果没有重复登录,则将该登录的用户信息添加入session中 request.getSession().setAttribute("user", user); // 比较保存所有用户session的静态变量中,是否含有当前session的键值映射,如果含有就删除 if (SessionUserListener.containsKey(request.getSession().getId())) { SessionUserListener.removeSession(request.getSession().getId()); } //把当前用户封装的session按,sessionID和session进行键值封装,添加到静态变量map中。 SessionUserListener.addUserSession(request.getSession()); } package org.com.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.com.model.User; public class SessionUserListener implements HttpSessionListener { // key为sessionId,value为HttpSession,使用static,定义静态变量,使之程序运行时,一直存在内存中。 private static java.util.Map<String, HttpSession> sessionMap = new java.util.concurrent.ConcurrentHashMap<String, HttpSession>(500); /** * HttpSessionListener中的方法,在创建session */ public void sessionCreated(HttpSessionEvent event) { // TODO Auto-generated method stub } /** * HttpSessionListener中的方法,回收session时,删除sessionMap中对应的session */ public void sessionDestroyed(HttpSessionEvent event) { getSessionMap().remove(event.getSession().getId()); } /** * 得到在线用户会话集合 */ public static List<HttpSession> getUserSessions() { List<HttpSession> list = new ArrayList<HttpSession>(); Iterator<String> iterator = getSessionMapKeySetIt(); while (iterator.hasNext()) { String key = iterator.next(); HttpSession session = getSessionMap().get(key); list.add(session); } return list; } /** * 得到用户对应会话map,key为用户ID,value为会话ID */ public static Map<String, String> getUserSessionMap() { Map<String, String> map = new HashMap<String, String>(); Iterator<String> iter = getSessionMapKeySetIt(); while (iter.hasNext()) { String sessionId = iter.next(); HttpSession session = getSessionMap().get(sessionId); User user = (User) session.getAttribute("user"); if (user != null) { map.put(user.getAd_user_id()+"", sessionId); } } return map; } /** * 移除用户Session */ public synchronized static void removeUserSession(String userId) { Map<String, String> userSessionMap = getUserSessionMap(); if (userSessionMap.containsKey(userId)) { String sessionId = userSessionMap.get(userId); getSessionMap().get(sessionId).invalidate(); getSessionMap().remove(sessionId); } } /** * 增加用户到session集合中 */ public static void addUserSession(HttpSession session) { getSessionMap().put(session.getId(), session); } /** * 移除一个session */ public static void removeSession(String sessionID) { getSessionMap().remove(sessionID); } public static boolean containsKey(String key) { return getSessionMap().containsKey(key); } /** * 判断该用户是否已重复登录,使用 * 同步方法,只允许一个线程进入,才好验证是否重复登录 * @param user * @return */ public synchronized static boolean checkIfHasLogin(User user) { Iterator<String> iter = getSessionMapKeySetIt(); while (iter.hasNext()) { String sessionId = iter.next(); HttpSession session = getSessionMap().get(sessionId); User sessionuser = (User) session.getAttribute("user"); if (sessionuser != null && sessionuser.getAd_user_id()==user.getAd_user_id()) { return true; } } return false; } /** * 获取在线的sessionMap */ public static Map<String, HttpSession> getSessionMap() { return sessionMap; } /** * 获取在线sessionMap中的SessionId */ public static Iterator<String> getSessionMapKeySetIt() { return getSessionMap().keySet().iterator(); } }
qq_34310669 2016-12-16
  • 打赏
  • 举报
回复
1,可以 为user表添加两个 字段 (登录IP 和 登录状态) 2,js 有个方法可以每隔一段时间执行一次 查询用户登录状态和IP是否改变如果改变提示当前用户被迫下线 然后销毁当前用户的session
ylovep 2016-11-04
  • 打赏
  • 举报
回复
个人理解 要控制前一个人失效肯定不能从第二个人登录的时候去让第一个人的session失效 session是会话级别的,应该做不到 个人认为应当还是从第一个人去着手 思路:第一个人登录的时候登录随机码存到session中,可以是登录的具体时间(确保唯一性),并且将登录随机码写入数据库 第二个人登录的时候讲新的登录随机码也存入数据库,并且正常登录 最后第一个人继续操作页面的时候 会有一个拦截器拦截当前随机码时候和数据库一致,不一致直接session.invalidate()注销。因为第二个人的登录将随机码已经update所以肯定不一样,达到挤出系统的效果。
ylovep 2016-11-04
  • 打赏
  • 举报
回复
引用 9 楼 u011619071 的回复:
[quote=引用 8 楼 ylovep 的回复:] [quote=引用 7 楼 u011619071 的回复:] [quote=引用 6 楼 ylovep 的回复:] web会话失效 怎么做到? 想请教一下。 具体步骤
HttpSession session = ServletActionContext.getRequest().getSession(); [/quote] 你登录的时候 能控制别人的session ?session只是会话级别的 [/quote] 登录的时候 每个人的session都根据账号来设置一下,同一个账号登录,另一个人失效,这应该没问题吧?[/quote] 如何控制另一个失效? session只是会话级别的 当前登陆人的session能控制别人的session? HttpSession session = ServletActionContext.getRequest().getSession(); 这行代码不能说明什么问题
X元素 2016-11-03
  • 打赏
  • 举报
回复
引用 8 楼 ylovep 的回复:
[quote=引用 7 楼 u011619071 的回复:] [quote=引用 6 楼 ylovep 的回复:] web会话失效 怎么做到? 想请教一下。 具体步骤
HttpSession session = ServletActionContext.getRequest().getSession(); [/quote] 你登录的时候 能控制别人的session ?session只是会话级别的 [/quote] 登录的时候 每个人的session都根据账号来设置一下,同一个账号登录,另一个人失效,这应该没问题吧?
ylovep 2016-11-03
  • 打赏
  • 举报
回复
引用 7 楼 u011619071 的回复:
[quote=引用 6 楼 ylovep 的回复:] web会话失效 怎么做到? 想请教一下。 具体步骤
HttpSession session = ServletActionContext.getRequest().getSession(); [/quote] 你登录的时候 能控制别人的session ?session只是会话级别的
X元素 2016-11-03
  • 打赏
  • 举报
回复
引用 6 楼 ylovep 的回复:
web会话失效 怎么做到? 想请教一下。 具体步骤
HttpSession session = ServletActionContext.getRequest().getSession();
ylovep 2016-11-03
  • 打赏
  • 举报
回复
web会话失效 怎么做到? 想请教一下。 具体步骤
X元素 2016-11-03
  • 打赏
  • 举报
回复
引用 1 楼 u011619071 的回复:
每个用户设置个身份凭证,登录成功就更新这个凭证,用户 跟凭证 对不上的就挤下去了
如果是移动端项目,可以让推送服务来帮忙把第一个失效用户踢下线,如果是web端,让一个用户的会话失效就行了。
ps45221 2016-11-03
  • 打赏
  • 举报
回复
当身份token该变时,还是把被挤掉的信息推送到那个人才好,然后让他可以重新登录,修改密码之类的,类似QQ这种,不然用户都莫名其妙的就不能用了。
tianfang 2016-11-03
  • 打赏
  • 举报
回复
核心是自己管理session 并且记录客户端IP,IP-地区对应关系 一个用户只有一个有效session就解决问题了
Mr_Hope 2016-11-02
  • 打赏
  • 举报
回复
引用 1 楼 u011619071 的回复:
每个用户设置个身份凭证,登录成功就更新这个凭证,用户 跟凭证 对不上的就挤下去了
大概能懂了,但是生成凭证,我第一个登录对象还需要时时监听凭证看他是否改变?那需要怎么实现
X元素 2016-11-02
  • 打赏
  • 举报
回复
每个用户设置个身份凭证,登录成功就更新这个凭证,用户 跟凭证 对不上的就挤下去了

67,513

社区成员

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

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