来公司两个月了, 进组也有1个多月,这是我的第一份工作, 也是第一个项目, 所以决定留下文字记录还是好些,由

于入组相对晚,我负责的也相对独立些 -- 系统管理, 首先要做的就是登录, 既然是应用系统肯定不允许同一账号异地

重复登录, 就这个问题我查了很多资料, 想做的完美些, 可谓是听取了百家之言。

我目前所知的方法可分为两种, 一是数据库来记录用户在线情况, 在登录把该用户数据库的标识字段赋值, 退出

时让该字段复位. 二是通过全局的内存对象来记录用户情况,  以该用户的登录名如user做为key存入application中或

是定义的一个全局的hashmap中, 退出删除全局对象中该user对应的信息, 据说还可用Cache全局对象,但相

比.NET,java实现Cache不是太容易. 而这些对于用户的登录事件都能实时的做出处理, 但用户的退出显然多种多样,

乖乖点击注销可能性很小, 还得考虑断电,掉线等情况, 所以用户的退出事件程序是捕获不了的, 这是由session的机

制决定的, 所以用户退出时,服务器想做到实时刷新是几乎是不可能的(除非用户点注销), 很多在线统计人数都不是实

时的, 一般都是通过添加session监听器, 然后设置session失效时间, 时间到了则调用监听器的对应方法释放相关的

数据, 如删除application中该用户的信息. 所以很可能会出现的一种情况是用户刚刚登录上系统, 然后掉线或其它原

因, 然后该用户重新登录, 但系统提示该用户已经登录, 无法再次登录. 只能等到原来的session失效, 遇到这种情况想

必是很郁闷. 这种情况是无法解决的, 就其根本还是因为用户的退出是无法确定的, 服务器无法区分用户的真在线还

是假在线. 既然这样可以像QQ一样以顶号的方式来处理, 就是用户登录时判断application中是否有该用户信息存在,

有则替换, 无则写入, 这样同一个账号的话, 先登录的会被后登录的踢出, 这就无需理会先登录的用户是真在线还是假

在线, 达到了实时的效果。不过我们项目不让这么用, 目办法只能用session监听了。

Servlet里面一共有八个监听, 其中有四个是session的监听接口与之关联的两个session事件,

这四个接口分别是:

HttpSessionAttributeListener and HttpSessionBindingEvent
HttpSessionBindingListener and HttpSessionBindingEvent
HttpSessionListener and HttpSessionEvent
HttpSessionActivationListener and HttpSessionEvent

HttpSessionAttributeListener: 用来监听session中的属性添加, 替换和删除,

只需创建一个类来实现HttpSessionAttributeListener接口, 然后在web.xml配个listener属性,其中litener-class是这

个类的路径. 该类会实现HttpSessionAttributeListener的三个方法. 分别对应session中的属性添加, 替换和删除. 该

类无需我们实例化使用, 因为servlet容器会创建该类的一个实例, 并是单例. 所以访问该系统的所有用户对session属

性的操作都会被HttpSessionAttributeListener监听到. HttpSessionBindingEvent事件的触发对象是任何object的实例, 因为session的setAttribute方法中可以存放任何object的实例。

HttpSessionBindingListener: 创建实现HttpSessionBindingListener接口的类, 不需在web.xml中配置, 该类会实现

HttpSessionBindingListener的两个方法valueBound()和valueUnbound(), 该类需要实例化使用, 将该类实例对象放

入session后会马上触发valueBound()方法, 从session中remove掉该实例时或session超时会马上触发

valueUnbound(), 很显然每个servlet都会创建一个该类的对象,所以多用户并发调用时它们都是相互独立的, 而且可

以创建多个实现HttpSessionBindingListener接口的类, 效果依然一样。

HttpSessionBindingEvent事件的触发对象是该类的实例本身(有点绕口),

举例
public class SessionListener implements HttpSessionBindingListener....
SessionListener sessionListener = new SessionListener();
//下面这句即是触发HttpSessionBindingEvent事件, 而触发对象正是sessionListener, 监听器的实例本身
request.getSession().setAttribute(request.getSession().getId(), sessionListener);

HttpSessionListener:监听session的创建和释放, 需在web.xml中配置, 重写sessionCreated()和

sessionDestroyed()方法, 它同样是容器创建的单列对象, 可以监听所有用户的session创建, 适合来做统计, 得注意

的一点是, 在浏览器访问服务器时, session的会话就创建了, 而session释放后才会调用sessionDestroyed()方法,

所以不能在sessionDestroyed()内做session清理工作, 因为已经无法获得session了。

HttpSessionActivationListener:当session在分布式环境中跨JVM时,实现该接口的对象得到通知,

需实行的方法sessionDidActivate()和sessionWillPassivate(),  Activate与Passivate是用于置换对象的动作,当

session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的

动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以容易理

解的,sessionDidActivate()与 sessionWillPassivate()分别于Activeate后与将Passivate前呼叫。

这四个都与session有关,但能做到验证登录的只有HttpSessionBindingListener and

HttpSessionListener   , 无疑使用前者更合适些。

项目中的防止同用户异地登录问题相关推荐

  1. php做异地登录验证,PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】

    本文实例讲述了PHP实现用户异地登录提醒功能的方法.分享给大家供大家参考,具体如下: 对于安全性要求比较高的web网站,特别是后台管理,有时候需要甄别自己的账号是否被盗或者是否有另一个人此刻登陆了在进 ...

  2. 新增公告提示功能,支持用户异地登录提醒和授权过期通知,JumpServer堡垒机v2.15.0发布

    11月1日,JumpServer开源堡垒机正式发布v2.15.0版本.在这一版本中,JumpServer新增公告提示功能,管理员可以根据不同的场景向所有用户实时发布重要通知:用户登录方面,新版本支持用 ...

  3. 设计银行项目中的注册银行用户基本信息的类,包括账户卡号、姓名、身份证号、联系电话、家庭住址。

    什么是类和对象? 类是模子,确定对象会拥有的特征(属性)和行为(方法),类的特点:类是对象的类型,具有相同属性和方法的一组对象的集合.对象是类的实例,什么是对象的属性?属性是对象拥有的各种特征:每个对 ...

  4. php实现第三方邮箱登录_PHP实现用户异地登录提醒功能的方法

    有时候你的网站账号被盗或你在别处登录操作后台时,右下角会弹出提示信息,提醒你的账号异地登录,或者会被强制下线.对于这种安全性要求比较高的web网站,很多后台管理都会做这种功能提醒. 甄别自己的账号是否 ...

  5. java1男0女_Java项目中数据库字段和用户页面显示之间的转换,比如性别字段:1显示男,0显示女...

    开发项目的过程中,经常会碰到这样的问题:学生信息管理系统中,学生的专业.性别字段,底层数据库中存储的信息和在页面显示的是不同步的.比如:性别字段数据库中1代表男,0代表女,而界面上需要我们显示男或者女 ...

  6. [laravel]用户异地登录后踢掉之前的登录

    不同用户和服务器之间由一个唯一的session来区分,但是一般情况下不同的session对应的用户model可以是同一个. 为了实现只能同时在一个地方登陆,可以在用户的字段里增加一个last_sess ...

  7. 使用session监听+spring MVC拦截器禁止用户重复登录

    在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...

  8. 【软件工程】软件项目中的用户

    文章目录 终端用户 用户在软件项目中承担的工作 用户体验 用户友好 以用户为中心的设计 利益相关的用户 终端用户 终端用户既指软件的最终操作者,也是软件工程内的一个概念,指终端用户的抽象集合,用于区分 ...

  9. SDU-PTA项目中JWT的使用

    2021SC@SDUSC 文章目录 用户的认证方式 传统的session认证 基于session认证所显露的问题 基于token的鉴权机制 JWT 什么是JWT及原理 JWT的构成 Header Pa ...

最新文章

  1. OpenCV数据类型转换:cnvertTo函数的使用
  2. OpenGL_17_点光源
  3. ubuntu修改服务器端口,服务器环境之4:ubuntu14.04安装tomcat,端口修改
  4. SpringMVC注解 @initbinder 解决类型转换问题
  5. 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
  6. Map-Reduce
  7. 2012-11-26 → 2012-12-02 周总结:项目又有新需求了,很兴奋
  8. 锻造恒生O45:致广大而尽精微
  9. 流程机器人 RPA:AI落地的接盘侠 | 甲子光年
  10. 与时俱进的迅捷多功能转换器
  11. Windows | 管理员权限打开CMD 快捷键
  12. 巴比特独家 | 我们梳理98家新三板公司年报,发现企业布局区块链6大特点
  13. 传奇私服架设微端搭建教程
  14. win7系统中建立家庭局域网
  15. 分享一下微带天线的心得体会
  16. 【android学习】记录应用内存优化
  17. python大众点评霸王餐_python抓取大众点评商户信息
  18. 《电气图用图形符号》
  19. maven 警告:Description Resource Path Location Type Classpath entry org.eclipse.m2e.MAVE
  20. STM32F4通过U盘升级程序

热门文章

  1. 用 Zotero 高效管理文献(图文详解)
  2. 关于Python的书籍的阅读心得,推荐一本python的书籍
  3. quartz记录job状态
  4. 如何查询数据表中指定字段的内容?
  5. 零基础搭建属于自己的网站--网页设计【学习笔记10】
  6. 理解并实现摩尔投票算法
  7. voliate深度解析原子性 可见性
  8. APS--PTN线性保护倒换功能
  9. Springboot整合ES,ES版不一致
  10. Win7网络共享看不见计算机,Win7电脑已开启共享却找不到设备 局域网显示空白该怎么解决...