Web应用中防止用户重复登录的简单达成方法
发布时间:2021-12-18 15:10:18 所属栏目:教程 来源:互联网
导读:主要使用application, listener, 把用户id和用户对象放到ConcurrentHashMap中,再存入application中 1、登录时把id和对象放到application中 2、登出时把remove掉 3、listener sessionDestroyed的时候,把对象session的key从application中去掉 一、登录时 //
主要使用application, listener, 把用户id和用户对象放到ConcurrentHashMap中,再存入application中 1、登录时把id和对象放到application中 2、登出时把remove掉 3、listener sessionDestroyed的时候,把对象session的key从application中去掉 一、登录时 // 2009.10.29 防止多处登录 Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY); logger.info("on line user object is null: {}", null == onlineUsersObject); if (null != onlineUsersObject) { // 不为空,说明有用户在线。 Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject; logger.info("----------001、打印在线用户 id 列表(检查用户是否已经在列表中)---"); for (Long id : onlineUsersMap.keySet()) { logger.info(String.valueOf(id)); } logger.info("------------------------------------------------------------------------"); for (Long id : onlineUsersMap.keySet()) { if (id.equals(userInfo.getId())) { logger.info("{} == {}", id, userInfo.getId()); msg = super.getMessage(request, "login.failed.username.hadLogined"); super.renderJavaScript(response, "window.onload=function(){alert('" + msg + "');location.href='login.do" + queryString + "'}"); return null; } } } // 2009.10.29 防止多处登录 // Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY); if (null != onlineUsersObject) { Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject; onlineUsersMap.put(ui.getId(), ui); } else { Map<Long, UserInfo> onlineUsersMap = new ConcurrentHashMap<Long, UserInfo>(); onlineUsersMap.put(ui.getId(), ui); session.getServletContext().setAttribute(Constants.ONLINE_USERS_KEY, onlineUsersMap); } logger.info("----------002、登录后打印在线用户列表-------------"); for (Long id : ((Map<Long, UserInfo>) session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY)).keySet()) { logger.info(String.valueOf(id)); } logger.info("------------------------------------------------------------------------"); 二、登出时 HttpSession session = request.getSession(false); UserInfo ui = (UserInfo) session.getAttribute(Constants.USER_INFO); // 在 application 中删除已经注销的用户 Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY); if (null != onlineUsersObject) { Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject; logger.info("user is null ? {}", ui); if (null != ui) { onlineUsersMap.remove(ui.getId()); } logger.info("------003、手动注销前打印在线用户列表-------------"); for (Long id : onlineUsersMap.keySet()) { logger.info(String.valueOf(id)); } logger.info("------------------------------------------------------------"); } if (null != session) { session.removeAttribute(Constants.USER_INFO); session.invalidate(); } if (null != onlineUsersObject) { Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject; onlineUsersMap.remove(ui); logger.info("------004、手动注销后打印在线用户列表-------------"); for (Long id : onlineUsersMap.keySet()) { logger.info(String.valueOf(id)); } logger.info("------------------------------------------------------------"); } 三、OnlineSessionListener public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { HttpSession session = httpSessionEvent.getSession(); logger.info("sessionDestroyed:{};session id is {}", session, session.getId()); Object onlineUsersObject = session.getServletContext().getAttribute(Constants.ONLINE_USERS_KEY); UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_INFO); logger.info("userInfo is null:{}", null == userInfo); if (null != onlineUsersObject && null != userInfo) { Map<Long, UserInfo> onlineUsersMap = (Map<Long, UserInfo>) onlineUsersObject; logger.info("---------------从在线列表中移除超时用户id前打印在线用户列表-------------"); for (Long id : onlineUsersMap.keySet()) { logger.info(String.valueOf(id)); } logger.info("------------------------------------------------------------"); for (Long id : onlineUsersMap.keySet()) { if (id.equals(userInfo.getId())) { logger.info(String.valueOf(id)); onlineUsersMap.remove(id); } } logger.info("---------------从在线列表中移除超时用户id后打印在线用户列表-------------"); for (Long id : onlineUsersMap.keySet()) { logger.info(String.valueOf(id)); } logger.info("------------------------------------------------------------"); } (编辑:我爱故事小小网_铜陵站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |