您的位置:首页 > 编程语言 > Java开发

javaWeb实现在线用户限制和相同账户多处登录限制

2017-02-06 14:15 561 查看
首先创建在线用户集合类:

public class OnlineUserMap {
public static Map<String , UserInfo > onlineuser = new HashMap<String , UserInfo >();

/**
* 得到在线用户
* @return
*/
public static Map<String , UserInfo > getOnlineuser(){
return onlineuser;
}

/**
* 添加在线用户
* @param sessionId
* @param userName
* @return
*/
public void addOnlineUser(String userId, UserInfo userinfo){
onlineuser.put(userId, userinfo);
}

/**
* 移除用户
* @param userName
*/
public void removeUser(String sessionId){
for(String userId : onlineuser.keySet()){
if(onlineuser.get(userId).getSessionId().equals(sessionId)){
onlineuser.remove(userId);
break;
}
}
}

}


然后配置session监听器(xml文件配置省略):

public class UserLoginListener implements HttpSessionAttributeListener {

@Override
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
String username = se.getName();
String sessionId = se.getSession().getId();
if (username == BaseAction.SESSION_USER_INFO){
UserInfo userInfo = (UserInfo)se.getSession().getAttribute(BaseAction.SESSION_USER_INFO);
new OnlineUserMap().addOnlineUser(userInfo.getUserId().toString(), userInfo);
}
}

@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
String username = se.getName();
String sessionId = se.getSession().getId();
if (username == BaseAction.SESSION_USER_INFO){
new OnlineUserMap().removeUser(sessionId);
}
}

@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
String username = se.getName();
String sessionId = se.getSession().getId();
if (username == BaseAction.SESSION_USER_INFO){
UserInfo userInfo = (UserInfo)se.getSession().getAttribute(BaseAction.SESSION_USER_INFO);
new OnlineUserMap().addOnlineUser(userInfo.getUserId().toString(), userInfo);
}
}

}


配置自定义拦截器(xml文件配置省略),在拦截器中对当前登陆用户进行判断(实现相同账户多处登陆限制):

public class CustomInterceptor implements Interceptor {

private static final long serialVersionUID = 1L;

public void destroy() {

}

public void init() {

}

public String intercept(ActionInvocation invocation) throws Exception {
if (invocation.getAction() instanceof BaseAction) {
BaseAction baseAction = (BaseAction) invocation.getAction();
Userinfo userInfo = (UserInfo) getSession().getAttribute(SESSION_USER_INFO);
if (userInfo == null)
throw new NotLogedInException();//未登录
UserInfo loginuserinfo = new OnlineUserMap().onlineuser.get(userInfo.getUserId());//当前登陆的Session/User
if(!loginuserinfo.getSessionId().equals(getSession().getId())){//用户在别的地方登陆
getSession().setAttribute(SESSION_USER_INFO, null);
getSession().setAttribute(KICKOUT_MESSAGE, "用户" + userInfo.getName() + "已在地址‘"+
loginuserinfo.getIp()+"’重新登陆,当前登陆失效!");
throw new NotLogedInException();//未登录
}

} else {
return invocation.invoke();
}
}
}


实现当前在线用户限制:

在登陆处加上判断即可:

if(new OnlineUserMap().onlineuser.keySet().size() > 50){
writeJson("当前在线的用户超过限制,请稍后再试!");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐