web实现 同一时间 用户只能在一处登录登录 java源码_JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)...

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 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中的配制

recordSession

com.weirhp.RecordSessionListener

三、可能存在的问题

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

四、后来的一些思考

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

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

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

java_web 用户只能一处登陆源码 一处登陆java_web 用户只能一处登陆源码,下载即运行,有注释的呢,简单易懂,不懂问我,可解释,so easy 立即下载

相关推荐

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

最近做了企业项目,其中有这样的需求要求同一帐号同一时间只能一个地点登陆类似QQ登录功能。下面小编通过本文给大家分享实现思路,感兴趣的朋友参考下吧

java 登陆地点_JavaWeb实现同一帐号同一时间只能一个地点登陆类似QQ登录功能...

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

weixin_35079766的博客 392

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

对于一个帐号同一时间只能一个登录,下文给大家介绍的非常详细,对java web qq 登录功能感兴趣的朋友一起看看吧

java web开发一个帐号同一时间只能一个登录

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

hakunamatata2008的专栏 1320

java 登录下线_java 实现 一个账号只能一个地方登陆,其他地方被下线

其实方法有很多的,我这献丑了。使用理解java 四大作用域。思路:理解java 四大作用域的关键。第一个地方登陆:1.得到请求的SessionId 和 登陆用户名2.把SessionId 存到application里,用户名存到当前session里ActionContext ac =ActionContext.getContext();Map applicationMap=ac.getAppl...

weixin_32136817的博客 1164

java 如何让利用ip 实现登录日志功能

1.导入如下pom org.nutz.http.Http; org.nutz.http.Response; iorg.nutz.json.Json; <!--调用淘宝接口API的依赖--> <dependency> <groupId>org.nutz</groupId> &l...

Joe_elena的博客 1853

java异地登录 怎么解决_同一帐号异地登录

在此之前也看了很多同一帐号异地登录的,有的是采用后登录者必须等待前登录者释放后才可以登录,我的项目中要用到想qq那样可以踢出,我具体的做法如下:LoginServelt.java登录使用OnlineUserListener.java 做session超时清理工作LogValidata.java 做权限验证logout.jsp做退出LoginServelt.java public void se...

weixin_39958100的博客 964

Java-实现异地登陆和超时登陆

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34246551的博客 2702

java实现只能一个相同用户登录功能

需求:使用相同用户登录系统,确保同名用户登录顶掉之前用户登录或者返回登录功能实现效果图: java实现: 首先 1.web.xml中配置监听器<listener><listener-class>com.bes.enterprise.console.viewer.system.action.userHttpListener</listener-class...

qq_35076190的博客 3821

java实现用户登录互挤,将前一个用户挤下线

1.场景 假设 Tom使用了用户1,Joker也是使用了用户1,两人同时对用户1 的相关数据进行了修改,就会造成数据的安全隐患,得保证多台设备登录账号只有一个账号能登录上。 2.思路 2.1 利用map的key-value数据结构,key可以重复,value不能重复的特性,将用户名和sessionid绑定存储起来。 2.2 首次登录在拦截器里面放行,登录成功将用户名和sessionid存储起来,当第二次登录时,用户名相同,sessionid不同的话则去登录,后面执行登录方法,发前一个账号和sessioni

zouyang920的博客 5373

实现同一用户只能一个登录

1.登录系统时,得到userName(数据库唯一),声明个Map key为userName value 为sessionId 并放入缓存中。 2.一个filter 类 每次请求 用userName 从缓存 的Map里 取出sessionId 如果不一致。remove 当时的sessionId 3.登录的时候在放入Map 之前看看 里面有没有这个key 如果有 先remove Map里

wangjian223344的专栏 2269

怎样实现同一个账户同一时间只能一个终端登录

不少系统都希望实现同一个账户同一时间只能一个地方登录,如腾讯QQ,当你的账户在另一个终端登录后,之前正在登录访问的终端会被强制下线,这样做的好处我认为有两点:1)能提高系统/网站的安全性,比如说如果你在操作过程中被挤下线了,你便能马上察觉到账户和密码已经泄露,要马上修改密码或联系管理员冻结账户;2)能减少系统的开销,因为每个登录的终端都需要耗费服务器资源,登录用户,Session占用的空间也会

风柏杨的技术博客 2万+

java 实现登录超时,Java-实现异地登陆和超时登陆

一、原理1. 异地登陆同一个账号,在不同的电脑(也可以不同的浏览器)登陆系统,前一个已经登陆的账号session被销毁,用户进行下一步操作时跳转错误页面。2. 超时登陆登陆后无操作*分钟后自动销毁session,用户进行下一步操作时跳转错误页面。3. 区分异地登陆和超时登陆起效时跳转的错误页面不相同。二、实现1.超时登陆由系统控制,在web.xml中配置,或者由监听器控制,利用session.s...

weixin_42500156的博客 2560

java确定同一用户登录_java保持同一时间同一账号只能一处登录

//登录页面 login.jsppageEncoding="UTF-8"%>登录String msg = (String)(request.getAttribute("msg")==null?"":request.getAttribute("msg"));%>function show(){if(''!=''){alert('');}}用户登录用户名密 码//主页面 main.jspp...

weixin_42576804的博客 822

java实现同一账号同一时间只能一个地方登录(QQ登录效果)

虽然像百度,CSDN等这些网站都没有这样做,当然也没有必要这要这样做。 但是在我们做企业内部应用的时候有时候可能会要求我们这样做(同一账号在统一时间只能一个登录),最近研究了下现在写出来大家分享下,还望多多的给意见。 我们先定义两个Map对象需要用到,存放用户与HttpSession的关系和sessionId与用户的关系。 一次来记录当前登录用户是否登录和当前session是否已

忠华 1万+

JavaWeb项目一个账号只能一处登录

登录的时,将sessionId添加到ServletContext域中: session.getServletContext().setAttribute(user.getId(), session.getId()); 登录时判断ServletContext是否存在当前用户对应的session: String sessionId = (String) req.getSession().getServletContext().getAttribute(u.getId()); if (null != sess

qq_29107721的博客 1385

java实现统一账户同一时间只能一个地方登陆

现在所做的手机软件要求类似QQ,当一处登陆.另外一处就要取消.所以查看了一下源代码.发现代码实现如下 web.xml:实现监听session作用.一旦session出现登陆、重复登录或者超时等.调用session中的方法 com.yitong.app.listener.SessionManageListener 15 session类:继承自javax.serv

4121
上一篇: java接口转发 不同端口_在Java中快速实现端口转发
下一篇: java中常用快捷键_java开发中的那些事(3)-------最常用到的几个快捷键
weixin_39627408
博客等级 码龄9年 37粉丝 143原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值