在开发中遇到一个问题,系统内,同一个账号可以在不同的地方多个人同时进行登陆,操作。
要求是同一账号在系统内必须保持唯一,即,若是有人用同一账号登陆了,已登录账号失效
解决方案有两种:
一种是在系统中设置状态位,登陆签到,退出签退...至于异常退出,在旧的session销毁之前是无法再次进行登陆的,配置session的监听,在session销毁时,进行数据库操作,更改库里对应用户的状态位
另一种思想:在服务器上维护一个map,以用户唯一标识为主键,值为session,登录时判断该用户是否已在,不在的话加入,已在的话将原session销毁,放入现有的session,这样的话前面登陆的人就不能再进行操作了。
下面实现后者,前者的话也是一样的
ConcurrentHashMap
是util.concurrent
包的一部分,它提供比Hashtable 或者 synchronizedMap 更高程度的并发性。而且,对于大多数成功的 get()
操作它会设法避免完全锁定,其结果就是使得并发应用程序有着非常好的吞吐量
public class SessionHandler { private static final ConcurrentHashMap<String,HttpSession> sessionMap = new ConcurrentHashMap<String, HttpSession>(); /** * 登录时调用 * @param userId 用户名 * @param session 会话 */ public static synchronized void kickUser(String userId,HttpSession session) { HttpSession oldSession = sessionMap.get(userId); if(oldSession != null) { if (!oldSession.getId().equals(session.getId())) { try{ oldSession.invalidate(); }catch (Exception e) {} sessionMap.put(userId,session); return; } } sessionMap.put(userId,session); } /** * 正常退出时调用 * @param userId */ public static void removeUserFromSessionMap(String userId) { if (sessionMap.containsKey(userId)) sessionMap.remove(userId); } }
至于异常的退出,只能等到会话超时了
此时必须设置监听会话超时时session销毁时附带进行的操作
public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { HttpSession session = httpSessionEvent.getSession(); SessionManager.removeUserFromSessionMap((String)session.getAttribute("userId")); } }web.xml中配置
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.cyb.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>login</url-pattern> </servlet-mapping> <listener> <listener-class>com.cyb.servlet.listener.SessionListener</listener-class> </listener> </web-app>
相关推荐
在IT行业中,尤其是在开发网络应用或者服务时,"同一账号禁止多人同时登录"是一个重要的安全性设计原则。这个原则主要是为了保护用户的账号安全,防止未经授权的访问和数据泄露。以下是对这个知识点的详细解释: ...
这种技术的核心在于通过虚拟化技术,将一台物理设备(如PC)转换成多个独立的虚拟桌面,每个桌面都拥有完整的操作系统和应用程序环境,但彼此之间相互隔离。这在企业环境中能够满足多种需求: 1. **数据安全与隔离*...
3. **处理登录冲突**:一旦检测到同一账号在不同位置尝试登录,系统会将之前的登录状态`Login_status`设置回0,强制下线之前的登录会话,从而确保同一账号在同一时间只能在一个地方登录。 #### 利用ASP.NET管理登录...
该变量用于控制是否允许同一账号在同一时间内由不同的人或设备登录。 ```php //-- 是否允许多人用同一帐号同时登录 -- $ONE_USER_MUL_LOGIN = 0; //1 允许; 0 禁止; ``` 3. **设置禁止多处登录**:如果希望...
1. 安全性:防止恶意用户通过同一账号同时在多个设备上登录,窃取用户信息或执行非法操作。 2. 账户资源管理:避免一个账号被多人共享,保证服务的公平性。 3. 个性化体验:确保每个登录会话的独立性,如保持各自的...
* 多提交代码,减少多人对同一文件的操作而产生的文件冲突。 * 提交代码时,应当书写明晰的标注,能够概要地描述所提交文件的信息。 * 不要提交不能通过编译的代码,应当确认自己能够在本地编译代码。 * 不要提交...
此外,特权账户,如系统管理员的账号,由信息系统的所有者维护,并定期审查,至少每三个月进行一次,以防止权限滥用或泄露。 访问控制应遵循分级原则,不同安全级别的资源之间设置相应的访问控制措施,确保信息的...
在Java Web开发中,防止多用户重复登录是一个重要的安全措施,确保每个账号只能在一个设备或浏览器会话中活跃。常见的解决方法有两种,本文主要探讨第二种方案。 首先,第一种解决方案是通过在数据库中添加一个标志...
- 多人使用:同一账号不得多人共享使用,以确保公平合理地使用资源。 6. **服务特点**: - 无限下载:该服务不限制流量,允许用户自由下载所需资源。 - 技术支持:遇到问题时,可以随时寻求帮助,以获得及时的...
3. **流量分配问题**:当多个用户共享同一账号时,由于流量限制,每个人的上网体验会受到影响。 4. **网络故障**:由于路由器设置错误,可能会造成整个局域网内大量设备无法正常获取IP地址,从而影响整个网络的稳定...
在日常使用中,定期检查网络设置,更新路由器固件,以及保持操作系统和应用程序的安全更新也是必要的,以抵御不断演变的网络威胁。通过这些措施,你可以更加安心地享受无线网络带来的便利,而不必担心成为蹭网族的...
4. 当多人不在同一地点办公时,可使用钉钉的电话会议功能。 5. 权限设置由系统管理员根据管理需求进行调整。 6. 如对钉钉软件有任何疑问,可向人事行政部咨询。 六、附则 1. 所有员工需共同遵守钉钉的使用规定,...
支持一个会员账号只允许一个会员登录,可以有效防止一个会员账号多人使用的情况; 支持会员注册信息管理,轻松地收集所需的会员资料; 支持会员登录时是否需要验证码; 支持自定义会员组 支持注册会员赠送资金、积分...
支持一个会员账号只允许一个会员登录,可以有效防止一个会员账号多人使用的情况; 支持自定义会员注册自段,轻松地收集所需的会员资料; 支持会员登录时是否需要验证码; 支持自定义会员组 支持注册会员...
本文将为您详细介绍如何限制Windows域用户多点并发登录,通过使用GPMC创建GPO和脚本来实现用户登录限制。 标题解释 AD域-限制windows域用户多点并发登录是指在Active Directory域中限制用户多点并发登录,以防止...
1. **信息安全行为规范**:员工在客户现场应遵守规定,如不得私自下载非工作相关软件,禁止使用客户网络进行游戏或浏览娱乐网站,特殊软件使用需申请,移动设备使用需合规,避免未经许可的数据传输。 2. **开发活动...
支持一个会员账号只允许一个会员登录,可以有效防止一个会员账号多人使用的情况; 支持会员注册信息管理,轻松地收集所需的会员资料; 支持会员登录时是否需要验证码; 支持自定义会员组 支持注册会员赠送资金、...