`
pzhu424
  • 浏览: 5644 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

B/S程序控制某一个用户在同一时间只能登录一台机器的讨论

 
阅读更多

       今天又有一个客户提出了这种奇葩式的需求,领导为了满足客户要求必须要实现,这让人巨头疼,各种很难实现的理由提出之后,被客户至上的要求一一否决(中国特色)...总之,必须要实现,哪怕是假的。没办法,只能硬着皮头去做。

1、实现思路

       初步的想法是用户在第一次登录系统的时候,将这次session会话根据用户ID保存在application会话中,那么用同一个用户再次登录系统,首先根据用户ID获取application中的session会话,如果获取的是null,或者session是invalidate的,就可以登录,并重新将这次会话按照用户ID保存在application中,反之禁止用户重复登录。

2、实现步骤

2.1、登录service

      不画流程图了,直接上代码吧:

//获取application会话
ServletContext application = request.getSession().getServletContext();
//获取上一次登录session
HttpSession oldSessionId = (HttpSession)application.getAttribute(userName);
try {
	if(oldSessionId == null || oldSessionId.getAttribute("user") == null) {
		application.setAttribute(userName, request.getSession());
	} else {
		return new Message("-2", "对不起,用户"+user.getTt_username()+"已经在另一台机器上登录!");
	}
} catch (IllegalStateException e) {
	application.setAttribute(userName, request.getSession());
}

 

 

       这段代码中判断session的invalidate的状态是通过捕获异常来处理的,因为request.isRequestedSessionIdValid()方法只能判断当前新的session,而且因为时间关系,我也没找到session对象本身有判断失效的方法。不知道还有没有其他方式,如有还请不吝赐教。

2.2、控制session失效

       这种方式依然会遇到大家老生常谈的问题:控制session失效。特别是在浏览器关闭的时候,当然,正常关闭浏览器的方式是比较好控制的,但是由于各种灾害、各种强制性关闭的情况下,控制session失效就成了无解!为此,在这种情况下只能走偏门了,给系统管理员做一个在线用户管理的功能,把那些由于“特殊需求”导致非正常关闭浏览器的用户提供一个后门式的控制session失效的(注销)的功能。

        用户通过注销来正常退出系统的功能就不细说了,先来看看正常关闭浏览器的处理吧,这里主要是用到了body标签的onbeforeunload的事件,废话少说,直接上代码:

function winCloseDetail() {
	if(event.clientY < 0 && event.clientX > 0 || event.altKey) {
		var a = new AppAjax("loginout.do",function(data){
		});
		a.submit();
	}
}

 

<body onbeforeunload="winCloseDetail()">

       在浏览器关闭之前触发onbeforeunload,然后让他通过ajax去执行类似注销的action,使session失效。注意,这里的event.clientX可能在某些浏览器中失效。

 

       至此,以上在用户正常进行系统退出操作情况下的处理,已经基本可以满足功能需求,那么由于用户的特殊原因导致的不正常关闭系统的情况下,又该如何处理呢?

       在这种情况下靠程序自动去处理session失效的方式,除了所谓的监听有可能办到外,恐怕也没有其他办法了,网上也有很多人说,自己写计时器,不断去扫描...oh!My God!求实现,为了这点功能。即使去这样做,你如何判断某一session在没有失效的情况下已经没有客户端在连接了呢?

       由于时间关系,我无法去深入研究网上大神提出的各种方式了,只能做一个在线用户管理的功能,靠管理员人工干预了,或者让用户等到session失效(领导说可以这样让用户去等!oh,我的神啊,你的客户至上呢?)

       这个功能的实现只说说思路了,有两种:

 第一种:因为Java Servlet API的版本 2.1中,已经取消了通过sessionid获取session了(如果可以,前面放入application里的应该是sessionid)。所以可以自己做一个SessionContext,然后实现HttpSessionListener接口去获取所有在线用户。网上一搜有很多例子。

第二种:在application会话里存放一个session集合。

3、小结

       我的这种方法同样也有很多局限性,包括浏览器的兼容啊等等,但是没办法,客户至上以及领导的淫威战胜了一切。如果各位大神还有其他更好的思路,或者此种思路有弊端,还请批评指正。

 

分享到:
评论

相关推荐

    一个账号同一时间只能登录一次

    首先,我们需要理解SSO的核心思想:当用户在一个地方登录后,他不能在其他地方再次登录,除非在原来的登录位置先进行登出。为了实现这个功能,我们通常会使用以下策略: 1. **会话管理**:在用户成功登录后,服务器...

    java DWR实现一个用户在同一时间只能登录一次的解决方案

    本解决方案主要关注如何利用DWR来实现一个用户在同一时间只能登录一次的功能,类似于QQ的单点登录机制。 首先,我们需要理解DWR的基本工作原理。DWR允许JavaScript直接调用服务器端的Java方法,并将结果返回到...

    同一个账号,同一时间只能允许他登录一次

    在IT行业中,"同一个账号,同一时间只能允许他登录一次" 这个需求通常被称为单点登录(Single Sign-On, SSO)。这是一个重要的安全性措施,防止用户账户被多个设备或不同地点同时使用,以增加系统的安全性,防止未经...

    J2EE限制同一账号同一时刻只能一个用户登录使用,向QQ一样

    总之,实现“J2EE限制同一账号同一时刻只能一个用户登录使用”是一个涉及会话管理、安全性、用户体验等多个方面的综合任务。通过合理的架构设计和技术选型,我们可以构建出高效且安全的单点登录系统。

    在线聊天室。实现了同一个帐号同一时间在不同地点只能一个人登录,如果一个人使用则另一个人被迫下线

    本项目实现了一个特定的功能:确保同一账号在同一时间只能在一个地方登录,一旦有另一人在不同地点尝试登录,已登录的用户将被强制下线。这种设计模式被称为“会话独占”,它在许多在线服务中,特别是安全性要求较高...

    filter过滤器实现权限访问控制以及同一账号只能登录一台设备

    认证成功后,通常会生成一个`Session`对象,并将用户信息存储在其中,以标识已登录状态。 2. **Filter实现**:创建一个自定义的`Filter`类,检查每个请求的`Session`中是否存在登录信息。如果不存在或者登录信息...

    限定同一用户名同一时间登录个数的解决方案收藏

    首先,要实现这个功能,我们需要一个新的数据表来记录用户登录状态。这个表叫做`Login`,包含以下字段: 1. `Login_ID`:自动编号的主键,标识每次登录事件。 2. `Login_UserID`:引用`user`表中的用户ID,用来关联...

    利用spring security控制同一个用户只能一次登陆

    标题中的“利用Spring Security控制同一个用户只能一次登录”是指在基于Spring Security的Web应用程序中实现单点登录(Single Sign-On, SSO)的功能,确保同一时间只有一个设备或浏览器会话可以登录同一用户的账户。...

    C/S一个帐号只能同时只能一个用户登录

    在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统?特别是对于银行或是财务部门,更是要限制用户以其工号身份多次登入。 利用SQL Server的全局临时表防止用户重复登录

    J2EE 用监听器实现同一用户只能有一个在线.docx

    在J2EE开发中,确保同一用户在同一时间只能有一个在线会话是非常重要的,这涉及到用户身份验证的安全性和系统资源的有效利用。标题提到的"J2EE 用监听器实现同一用户只能有一个在线"是指通过使用Java Servlet API中...

    Asp.net中实现同一用户名不能同时登陆

    因此,限制同一用户账户在同一时间只能在一个地方登录是非常必要的。 #### 二、实现原理及步骤 本文介绍的方法主要是通过ASP.NET中的全局状态存储机制来实现的,具体步骤如下: 1. **使用Application对象存储在线...

    java中如何实现同一账号不能同时登录

    在这个方法中,我们可以使用一个监听器来监听用户的登录状态,当用户登录时,监听器将检查用户是否已经登录,如果已经登录,则强制退出之前的session。 实现同一账号不能同时登录的关键是保存每个用户的唯session,...

    同一时间只能启动一个exe

    在C#编程中,"同一时间只能启动一个exe" 是一个常见的需求,特别是在设计多用户系统或者需要确保程序单实例运行的应用中。这样的限制通常是为了防止应用程序被多次打开,导致资源浪费或数据冲突。实现这一功能的方法...

    ASP帐号只能同时登陆一个

    例如,如果一个用户在登录后没有注销,其他人就无法在同一时间用该账号登录,这样可以防止未授权的访问和潜在的恶意操作。 实现"ASP帐号只能同时登陆一个"的方法通常包括以下步骤: 1. **会话管理**:在用户成功...

    Java同一账号限制同时登录

    Java实现同一账号限制同时登录,里面是源码,写得很清楚。利用application实现的,入门选手的福利

    shiro实现单点登录(一个用户同一时刻只能在一个地方登录)

    通过这种方式,我们可以确保用户在同一时间只能在一个地方登录,增强了系统的安全性。在实际项目中,根据应用的具体需求,可能还需要处理跨域问题、令牌验证等复杂情况,但基础原理和上述步骤相似。

    Asp.net中实现同一用户名不能同时登录(单点登录)

    这样一般都会存在一个问题:如果用户没有正常退出系统,那么他接下来继续登录的时候,因为Session没有过期等问题,会被拒绝继续登录系统,只能等待Session过期后才能登录。本文介绍的方法是采用类似于MSN登陆的方法...

    JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)

    - 防止多设备登录:限制用户在同一时间只能使用一个设备进行登录操作。 - 提升用户体验:避免用户因忘记退出而在其他地方造成的隐私泄露。 2. **实现过程**: a. **问题分析**: - 通常,登录信息会存储在...

    .net防止同一用户同时登陆

    在现代企业级应用开发中,为了保障系统的安全性、稳定性和用户体验,经常需要实现在线用户控制机制,即防止同一用户在同一时间多处登录。本文将详细介绍如何在.NET框架下实现这一功能,并通过具体的代码示例进行解释...

    防止同一用户同时登陆

    简单来说,就是确保系统中的每个用户在同一时间内只能在一个地方进行登录操作。这有助于避免因用户在不同设备或浏览器上同时保持登录状态而导致的安全问题或数据混淆情况发生。 #### 技术实现方法 实现这一功能的...

Global site tag (gtag.js) - Google Analytics