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

JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)的实现思路如下所示:

一、该功能有什么作用

大家想想吧。反正总会有这样的需求的。这年头什么需求不会有。。呵呵。有时候也不一定是需求,很有可能为了安全也会这么做。例如考试系统,在线聊天系统,很有必要做成这样的吧。

二、实现过程

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<SessionAndUser> sessions;
public static String loginFlag = "loginUser";
static {
if (sessions == null) {
sessions = Collections.synchronizedList(new ArrayList<SessionAndUser>());
}
}
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中的配制

<listener>
<display-name>recordSession</display-name>
<listener-class>com.weirhp.RecordSessionListener</listener-class>
</listener>

三、可能存在的问题

整个个程序可能有的点没有想到。可能存在一些bug,用于具体项目需谨慎,欢迎大家拍砖,也希望给点建议。我再改进。

四、后来的一些思考

  如果两台机器使用同一帐号在同一时刻登录系统,是不是两个帐号都可以登录成功呢。。(还有就是这个session List很大时,在遍历的时间段中两台机器使用同一帐号在同一时刻登录系统也可能会成功登录的)。很是纠结。。应该怎么控制呢?

(解决办法:经测试Listener在系统中是一个单例,在它的方法上加上synchronize关键字就可以保证list的线程安全了。)

以上所述是小编给大家介绍的JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, web
, 实现
QQ登录
ajax实现类似百度搜索、往事只能回味类似歌曲、java实现类似迅雷下载、java实现类似百度文库、安卓实现类似ios推送,以便于您获取更多的相关知识。

时间: 2024-10-01 16:16:52

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

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

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

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

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

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

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

微信公众帐号验证方法

前段时间申请了一个微信公共帐号,想要在服务器端编程实现自动回复,同时也接触一下关于django编程,以继续发扬我在python的web道路.终于到现在,我才有时间将这个过程记录下来,具体如下: 首先明确目标--成为微信公众号第三方开发者,通过消息API认证. 使用的语言和框架 :python的django 主机的平台:sae云平台 微信平台:微信公众帐号 当然,先要阅读微信的消息接口,其是通过微信服务器获取用户的回复,用get请求发送到我的服务器,然后我给予回应.所以只需要简单的编程就可以完成验

五大趋势之国内互联网帐号开发

网页制作Webjx文章简介:帐号是一个你使用服务的必备品,帐号数量(用户数)也是比流量更能够衡量一个网站影响力的指标,所以帐号资源一直被大量网站看作命根子. 多年之前国外就支持Email作为网站帐号,从2005年出现OpenID,再到2008年.2009年Facebook Connect的大红大紫.他们的目的是解放 帐号是一个你使用服务的必备品,帐号数量(用户数)也是比流量更能够衡量一个网站影响力的指标,所以帐号资源一直被大量网站看作命根子. 多年之前国外就支持Email作为网站帐号,从2005

企业信息化系统基础——AD:使用C#批量创建帐号

创建 如果一个公司打算使用微软的产品来构建自己的办公自动化系统,那么,建议采用主域控制的方式.那么,必然就要用到活动目录(AD),这样,IT部门就需要为公司的每一个员工来创建域帐号.如果公司比较大的话,这是一个很大的工程.而且,我们会发现,有些工作量基本上是在重复劳动,人力资源部为了给It部门提供人员名单,会录入一次人员的各种信息,比如姓名.工号.所属部门.部门领导.电话号码等等,那么,IT人员在拿到这张表后,他又要重新录入一次.并且常常会因为人为的原因导致帐户中出现错误.下面,我们就用C#编写

两个雅虎邮箱可以绑定一个阿里云帐号吗

  通过雅虎邮箱页面只能绑定一个云邮箱帐号,建议您先将其中一个雅虎邮箱绑定一个云帐号后,另外一个雅虎邮箱通过pop的方式,将邮件代收到您云邮箱. 代收方法: 登录阿里云邮箱后,点击页面右上方"邮箱设置"; 在所出现的邮箱设置页面选择"其他邮箱" 点击"新建其他邮箱账号",并输入完整的雅虎邮箱地址和密码,页面会自动跳出相应邮箱的"接收邮件服务器地址"和"端口",只需点击"提交"即可 备注:

Chapter 1 Securing Your Server and Network(3):使用托管服务帐号

原文:Chapter 1 Securing Your Server and Network(3):使用托管服务帐号 原文出处:http://blog.csdn.net/dba_huangzj/article/details/38017703,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以"原创"形式发布,也不得已用于商业用途,本人不负责任何法律责任.         前一篇:htt

完全解剖安全帐号管理器(SAM)结构_安全教程

安全设置不得不需要了解的东西一.摘要 分析安全帐号管理器结构是在一个多月前做的事情了,只零碎地记录下片段,没有发布过.不发布的主要原因是安全帐户管理器(SAM)是WIN系统帐户管理的核心,并且非常系统化,我也有很多地方仅仅是进行的推断和猜测,同时,SAM hack可能造成启动时lsass.exe加载帐户管理器出错,即便是安全模式也不能修复(启动时候必然加载SAM)使得整个系统启动崩溃(我通常需要依靠第二系统删除SAM文件来启动).至于现在发布出来,主要是因为Adam和叮叮的<克隆管理员帐号>种