java用户不能同时登陆_java中如何实现同一账号不能同时登录

这篇博客分享了两种Java实现防止同一用户账号同时登录的解决方案。第一种方法是在BaseAction中使用静态Map保存Session,当用户再次登录时清除旧Session。第二种方法是通过实现HttpSessionListener监听Session,维护一个HashMap来跟踪已登录用户,确保账号唯一性。
摘要由CSDN通过智能技术生成

经过两天的研究,下面给两个方法.不个是webwork版本的,一个是修改过后的网上的意见监听器版本的

(一) 首先先上自己的研究成果1:首先在baseAction 中或者直接在action中写一个方法,和一个静态map(保存唯一的session)

静态map

Java代码 收藏代码private static Map httpssessionmap = new Hashtable(); //避免重复登录

2:主方法(给一个返回值是为了给提示)

Java代码 收藏代码public Integer loginMethod(LoginInfo loginfo,Users user) throwsException{int returnnum=0;if(httpssessionmap.containsKey(user.getUser_code())){//qztc_LogInfo(user, (String)httpssessionmap.get(user.getUser_code()).getAttribute(LOGIN_IP));

try{//获取session

logger.info("因在其它地方重新登录被系统强制退出");

httpssessionmap.get(user.getUser_code()).removeAttribute(LOGIN_INFO);

}catch(Exception e){

e.printStackTrace();

}

httpssessionmap.remove(user.getUser_code());if (pcount > 0)

pcount--;

Thread.sleep(10);

returnnum=1;

}

set(LOGIN_INFO,loginfo);//set(LOGIN_INFO, new LoginInfo(user));//set(LOGIN_IP, this.getIPAddress());

httpssessionmap.put(user.getUser_code(), getHttpSession());

pcount++;

info(getLogPrex_().append("进入系统").toString());//info(this.LOG_TYPE_LONGIN, "进入系统");

returnreturnnum;

}3:获得登录用户的唯一session

Java代码 收藏代码protectedHttpSession getHttpSession(){returnServletActionContext.getRequest().getSession();

}4:set方法,设置session

Java代码 收藏代码protected voidset(String name, Object value)

{

ActionContext.getContext().getSession().put(name, value);

}5:说明: 最后可以在 用户登录的action中 调这个baseaction方法...接下来该干嘛干嘛去..

(二) 网上哥们给的意见 http://sunxin.org/forum/thread/22787.html(回帖的用户"钟爱java ") 应该是忘记session失效的问题了.

先上代码(代码整理得我都吐血了.)--接下来都是原话

SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录)

Java代码 收藏代码packagecom.test;import javax.servlet.http.*;import java.util.*;public class SessionListener implements HttpSessionListener{ private static HashMap hUserName = new HashMap();//保存sessionID和username的映射 /**以下是实现HttpSessionListener中的方法**/

public voidsessionCreated(HttpSessionEvent se){

}public voidsessionDestroyed(HttpSessionEvent se)

{

hUserName.remove( se.getSession().getId() );

}/** isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法

* @param sUserName String-登录的用户名称

* @return boolean-该用户是否已经登录过的标志*/

public static booleanisAlreadyEnter(HttpSession session,String sUserName,LoginInfo loginfo){boolean flag = false;if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)

flag = true;//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)

Iterator iter =hUserName.entrySet().iterator();while(iter.hasNext()) {

Map.Entry entry=(Map.Entry)iter.next();

Object key=entry.getKey();

Object val=entry.getValue();if( ( (String)val ).equals(sUserName) ){

hUserName.remove(key);

}

}

hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username

System.out.println("hUserName = " +hUserName);

}else{//如果该用户没登录过,直接添加现在的sessionID和username

flag = false;

((ActionContext) session).put(LOGIN_INFO, loginfo);

hUserName.put( session.getId(),sUserName );

System.out.println("hUserName = " +hUserName);

}returnflag;

}/** isOnline-用于判断用户是否在线

* @param session HttpSession-登录的用户名称

* @return boolean-该用户是否在线的标志*/

public static booleanisOnline(HttpSession session){boolean flag = true;if( hUserName.containsKey( session.getId() ) ){

flag= true;

}else{

flag= false;

}returnflag;

}

}

web.xml部署于/App/WEB-INF下

Xml代码 收藏代码<?xml version="1.0" encoding="ISO-8859-1"?>

com.inspirer.dbmp.SessionListener

应用部分1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin")

既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值