jsp web中实现同一帐号同一时间只能一个地点登陆

jsp web中实现同一帐号同一时间只能一个地点登陆
一、该功能有什么作用
大家想想吧。反正总会有这样的需求的。这年头什么需求不会有。。呵呵。有时候也不一定是需求,很有可能为了安全也会这么做。例如考试系统,在线聊天系统,很有必要做成这样的吧。
二、实现过程
a.问题分析
    在系统中,我们一般都是把登录信息绑定到session中,看来从这入手是可能找到解决办法。说白了,也就是当用户登录时,判断一下这个用户有没有登录,如果登录了,就把以前的那个session清除掉就OK了。。看似很简单是不?其实你细想你会发现有以下问题:如何得到之前这个用户有没有登录过,也就是如何访问到所有登录的session信息呢?
  b.具体实现
   大家知道,在j2ee api好像是没有具体的方法直接得到所有session信息的。但是我们可以通过配制监听器,监控所有的session创建和消毁过程,以及可以监控session中的属性的创建,删除和替换过程。
其实我们只要做以下处理即可:
在保存用户登录信息到session时,对应的也就是session一个属性的创建过程(attributeAdded),可以把当前这个session记录到一个ArrayList中。
其实在保存到list中时你要首先遍历一下这个list中有没有已经存在该用户的登录信息。如果存在就消毁掉这个list中存在的session信息,并且从list中移除,不存在就把该session信息放到list中。
在session的登录信息消毁时,直接把该sesseion从list中移除掉。
还有就是当用户登录后没有退出直接登录这个时候是一个session属性的替换过程。也要做处理判断新的用户是否已经在除了当前session的其它session中是否存在。存在则删除。
具体代码如下:

package com.weirhp;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class RecordSessionListener implements HttpSessionAttributeListener,
HttpSessionListener {
private static List sessions;
public static String loginFlag = "loginUser";

static {
if (sessions == null) {
sessions = Collections.synchronizedList(new ArrayList());
}
}

public void attributeAdded(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();

System.out.println("-------------*start added*-----------------------");
String attrName = e.getName();

// 登录
if (attrName.equals(loginFlag)) {
User nowUser = (User) e.getValue();
User sUser = (User)session.getAttribute(loginFlag);
// 遍历所有session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())) {
tem.getSession().invalidate();//自动调用remove
break;
}
}

SessionAndUser sau = new SessionAndUser();
sau.setUserID(nowUser.getName());
sau.setSession(session);
sau.setSid(session.getId());
sessions.add(sau);

}

}

public void attributeRemoved(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start Removed*-----------------------");
String attrName = e.getName();
// 登录
if (attrName.equals(loginFlag)) {
User nowUser = (User) e.getValue();
// 遍历所有session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())) {
sessions.remove(i);
break;
}
}

}
}

public void attributeReplaced(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start replace*-----------------------");
String attrName = e.getName();
int delS=-1;
// 登录
if (attrName.equals(loginFlag)) {
// User nowUser = (User) e.getValue();//old value
User nowUser = (User)session.getAttribute(loginFlag);//当前session中的user
// 遍历所有session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())&&!tem.getSid().equals(session.getId())) {
System.out.println("Remove:invalidate 1!");
delS=i;
}else if(tem.getSid().equals(session.getId())){
tem.setUserID(nowUser.getName());
}
}

if (delS!=-1) {
sessions.get(delS).getSession().invalidate();//失效时自动调用了remove方法。也就会把它从sessions中移除了
}

}
}

public void sessionCreated(HttpSessionEvent e) {
}

public void sessionDestroyed(HttpSessionEvent e) {
}

}
在web.xml中的配制
1
2 recordSession
3 com.weirhp.RecordSessionListener
4

时间: 2024-08-29 07:12:00

jsp web中实现同一帐号同一时间只能一个地点登陆的相关文章

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

JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)的实现思路如下所示: 一.该功能有什么作用 大家想想吧.反正总会有这样的需求的.这年头什么需求不会有..呵呵.有时候也不一定是需求,很有可能为了安全也会这么做.例如考试系统,在线聊天系统,很有必要做成这样的吧. 二.实现过程 a.问题分析 在系统中,我们一般都是把登录信息绑定到session中,看来从这入手是可能找到解决办法.说白了,也就是当用户登录时,判断一下这个用户有没有登录,如果登录了,就把以前的那个session清除

Java Web 实现QQ登录功能一个帐号同一时间只能一个人登录_java

对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现: 1 .在用户登录时,把用户添加到一个ArrayList中 2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录 3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况 ① 使用注销按钮正常退出 ② 点击浏览器关闭按钮或者用Alt+F4退出,可以用JavaScript捕捉该页面关闭事件, 执行一段Java方法删除ArrayList中的用户 ③ 非正常退出,比如

删除XP系统中多余用户帐号的方法

删除XP系统中多余用户帐号的方法   方法一: 1.点击开始-运行.输入lusrmgr.msc 然后点击确定即可进入上面的操作界面了! 2.如果我们是想启用来宾账户是不需要新建账户的.我们点击控制面板.进入用户账户设置.. 3.然后进入Guest.我们点击启用来宾账户即可! 4.然后我们在登录电脑系统或者是锁屏的时候就能看到在administrative下面就会多出一个Guest账户, 这个就可以不用密码就能进入. Xp系统如何删除用户账号的具体方法二: 1.打开控制面板中的用户头像图标, 2.

jsp页面中两种方法显示当前时间的简单实例_JSP编程

在jsp页面实现显示当前的日期时间,我们可以用一下两种方式实现: 1. 通过在jsp页面添加Java代码实现,主要代码如下所示 java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); java.util.Date currentTime = new java.util.Date(); String time = simpleDateForm

servlet怎么重定向到了另一个jsp页面中然后再页面一加载弹一个alert的提示框

问题描述 servlet怎么重定向到了另一个jsp页面中然后再页面一加载弹一个alert的提示框 解决方案 解决方案二:重定向的话用sendRedirect()页面一加载就弹出提示可以在body标签中使用onload.<bodyonload="自定义function">解决方案三:Servlet中用response.sendRedirect("jsp页面").jsp页面的body体重加入onload事件如:<bodyonload="a()

c#中如何每隔一段时间产生一个随机数并将其放入数据库中,随机数的变化范围不能太大

问题描述 c#中如何每隔一段时间产生一个随机数并将其放入数据库中,随机数的变化范围不能太大 解决方案 解决方案二:放一个定时器在tick里面写intx=newRandom().NextDouble(下限,上限);//把它存入数据库

ubuntu中启用root帐号方法

 代码如下 复制代码 sudo passwd root 此命令将会重新设置 root 的密码,按照提示输入新的密码,并加以确认.之后,重启系统时,就可以用 root 登录了. 如果你想要禁用 root 帐号,则执行下列命令:  代码如下 复制代码 sudo passwd -l root

关于帐号被挤掉后又自动登陆的问题

问题描述 先在A手机登陆了App,后来把A手机卖了(App当时是被杀死的),换了B手机,在B手机上等了App,登上去了,很开心,但是过了一段时间,突然有一天,我正在用B手玩着App时弹出了一个"同一帐号已在其他设备登陆",心里咯噔一下,难道帐号被偷了? 问:怎么做到当A手机重新打开app时不是自动登陆,而是弹出"同一帐号已在其他设备登陆",这种情况怎么处理?用户的状态我是否需要自己维护啊?sdk有相关的api吗 解决方案 1.设置自动登录重启应用后就会自动登录,除非

Win8系统Metro界面中的QQ帐号注销方法

首先在社交应用登入后,可以使用右键或由屏幕外侧由上向下(或由下向上)滑入调出AppBar,可以看到"注销"选项,点击注销即可,例如QQ应用. 少数社交应用可以通过点击头像修改在线状态实现注销,例如QQ应用 极少数社交应用在AppBar和在线状态中无法设置"注销"选项时,用户需要查看一级界面中的"设置"选项下的"注销"选项,然后点击注销即可,例如微博