来公司两个月了, 进组也有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. 关于text段、data段和bss段
  2. c语言怎么让他变成程序,用C语言编了个程序,怎样让它点击“下一步”后继续弹出窗口...
  3. Java传统的io和nio区别_Java中IO和NIO的本质和区别
  4. Java Script Closure(js闭包)-浅谈
  5. 错误处理: socket.timeout: The read operation timed out
  6. 从无到有算法养成篇-线性表实战篇
  7. 《STL源码剖析》学习--六大组件
  8. 科学计算机乱码,软件界面乱码可以这么“破”
  9. Mysql错误:服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助。
  10. java基础-注解Annotation原理和用法
  11. CGCTF-Web-签到2
  12. Java MathContext类| hashCode()方法与示例
  13. 谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!
  14. python计算时间装饰器_python 写一个计算运行时间的装饰器
  15. SVN-关于分支创建合并
  16. 基于visual Studio2013解决C语言竞赛题之0608水仙花函数
  17. 轻松看懂概率论与图论基础数学知识
  18. 简单的物流项目实战,WPF的MVVM设计模式(二)
  19. MacBook如何通过键盘快捷键输入特殊字符_特殊符号
  20. 单出口双防火墙双核心冗余_各类冗余备份技术合集

热门文章

  1. 8位12指令硬布线CPU设计
  2. HTML电气规范表格不显示,电气控制柜的布线工艺要求和常见问题
  3. 大功率四轮电动车控制器代码, 原理图和Pcb
  4. etabs数据_ETABS二次开发入门(一)——简介
  5. 马云演讲:从阿里巴巴退休后将要做三件事
  6. 文本自动生成研究进展与趋势之数据到文本的生成
  7. WY12 藏宝图 ( 双指针 )
  8. 首届英才在线编程大赛-编程题回顾-java实现
  9. 6-2 综合成绩排名-结构体二 (100分)
  10. PTN设备和SDH设备有什么区别?可以互通吗?