一个简单的Java Web应用功能"帐户不允许多人使用"

      原文来自:http://hi.baidu.com/harbin%5Fsakura/blog/item/2545cfeab1000cddd439c9a9.html

在web应用的许多场景,我们可能都没有限制多人使用同一帐户登陆或使用系统,其实按理来说这应该是一个系统帐户管理中的一个基本功能,但是很多系统还是没有做任何限制。但是在一些特定的业务中,这个功能还是必须要有的,当我们接到这样的需求的时候,应该如何来实现呢?最近做的一个系统中就有这样的需求,现在给出我的解决办法。
通常我们在web应用中,用户登陆以后一般都会将用户ID保存在Session中,并通过过滤器Filter来判断用户Session是否有效,如果失效,则将用户界面跳转回登陆界面。但是每个登陆人的动作,如何才能影响其他人的Session呢?
了解HtpSessionListener
在web应用中配置HttpSessionListener可以监听所有创建以及销毁HttpSession事件,并添加一些自定义的功能。我们可以对功能设计如下,在用户登陆的时候,在Seesion中放置用户ID。在HttpSessionListener中定义全局静态变量sessionMap,每个用户登陆的session全部放在其中并与用户ID做key,每次用户登陆时在把sessionMap中对应用户ID的session先失效,相当于将其他用户的session失效,等同于将同帐号其他登陆人从系统中踢掉,再向sessionMap中写入自己的session。具体实现步骤如下:
1.首先在web.xml中加入监听
<listener> 
<listener-class>com.xx.OnlineUserListener</listener-class> 
</listener>

2.OnlineUserListener类的实现
public class OnlineUserListener implements HttpSessionListener{

@SuppressWarnings("unchecked")
public static HashMap sessionMap = new HashMap();

@SuppressWarnings("unchecked")
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
sessionMap.put(session.getId(), session);
}

public void sessionDestroyed(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
// 判断当前session user是否有值
if (session.getAttribute("userId") != null &&    session.getAttribute("userId").toString().length() > 0) {
// session销毁清空map 更新map
sessionMap.remove(session.getAttribute("userId").toString());
session.invalidate();
}
}
}

3.登陆时实现踢人功能
public void ValidateIsOnline(HttpServletRequest servletRequest,HttpServletResponse servletResponse,String sessionName){
/* 判断当前用户session是否过期 */
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();

//从session里取的用户名信息
String username = session.getAttribute(sessionName).toString();

if (OnlineUserListener.sessionMap.get(username.trim()) != null && OnlineUserListener.sessionMap.get(username.trim()).toString().length() > 0) {
// 当前用户已经在线 删除用户
HttpSession sessionold = (HttpSession) OnlineUserListener.sessionMap.get(username.trim());
// 注销已在线用户session
sessionold.invalidate();
OnlineUserListener.sessionMap.remove(username.trim());
// 清除已在线用户,更新map key 当前用户 value session对象
OnlineUserListener.sessionMap.put(username.trim(), session);
OnlineUserListener.sessionMap.remove(session.getId());
} else {
// 根据当前sessionid 取session对象。 更新map key=用户名 value=session对象 删除map
OnlineUserListener.sessionMap.get(session.getId());
OnlineUserListener.sessionMap.put(username.trim(),OnlineUserListener.sessionMap.get(session.getId()));
OnlineUserListener.sessionMap.remove(session.getId());
}
}

以上四步,配合用户Session过滤器,便可以实现一个帐户只可以在一处登陆的需求了。
希望大家可以指正,如果有好的实现思路,希望也可以互相交流,取长补短. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值