2519人阅读
&&&&&&& 来公司两个月了, 进组也有1个多月,这是我的第一份工作, 也是第一个项目, 所以决定留下文字记录还是好些,由
于入组相对晚,我负责的也相对独立些 -- 系统管理, 首先要做的就是登录, 既然是应用系统肯定不允许同一账号异地
重复登录, 就这个问题我查了很多资料, 想做的完美些, 可谓是听取了百家之言。&
&&&&&&&&我目前所知的方法可分为两种, 一是数据库来记录用户在线情况, 在登录把该用户数据库的标识字段赋值, 退出
时让该字段复位. 二是通过全局的内存对象来记录用户情况,& 以该用户的登录名如user做为key存入application中或
是定义的一个全局的hashmap中, 退出删除全局对象中该user对应的信息, 据说还可用Cache全局对象,但相
比.NET,java实现Cache不是太容易. 而这些对于用户的登录事件都能实时的做出处理, 但用户的退出显然多种多样,
乖乖点击注销可能性很小, 还得考虑断电,掉线等情况, 所以用户的退出事件程序是捕获不了的, 这是由session的机
制决定的, 所以用户退出时,服务器想做到实时刷新是几乎是不可能的(除非用户点注销), 很多在线统计人数都不是实
时的, 一般都是通过添加session***器, 然后设置session失效时间, 时间到了则调用***器的对应方法释放相关的
数据, 如删除application中该用户的信息. 所以很可能会出现的一种情况是用户刚刚登录上系统, 然后掉线或其它原
因, 然后该用户重新登录, 但系统提示该用户已经登录, 无法再次登录. 只能等到原来的session失效, 遇到这种情况想
必是很郁闷. 这种情况是无法解决的, 就其根本还是因为用户的退出是无法确定的, 服务器无法区分用户的真在线还
是假在线. 既然这样可以像QQ一样以顶号的方式来处理, 就是用户登录时判断application中是否有该用户信息存在,
有则替换, 无则写入, 这样同一个账号的话, 先登录的会被后登录的踢出, 这就无需理会先登录的用户是真在线还是假
在线, 达到了实时的效果。不过我们项目不让这么用, 目办法只能用session***了。
Servlet里面一共有八个***, 其中有四个是session的***接口与之关联的两个session事件,
这四个接口分别是:
HttpSessionAttributeListener and HttpSessionBindingEventHttpSessionBindingListener and HttpSessionBindingEventHttpSessionListener and HttpSessionEventHttpSessionActivationListener 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&&&, 无疑使用前者更合适些。&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:41046次
排名:千里之外
原创:23篇
评论:15条
(1)(2)(2)(2)(3)(1)(2)(2)(6)(3)(1)(1)(1)关于QQ异地登录的问题,求大神解答●v●?
我把QQ密码告诉了别人,他异地登录腾讯游戏平台(TGP),然后我收到了异地登录的提醒,但是我不想让他登录QQ看我的空间,那么如果他下次直接登录QQ空间的话,我会收到异地登录的提醒嘛,(刚刚拿朋友的小号试了一下,发现只有打一次的提醒),求大神解答^o^
已有帐号?
无法登录?
社交帐号登录支付宝登录异常怎么办 支付宝异地登录解决办法 - 手机技巧 - 电脑百事网
手机扫描二维码
支付宝登录异常怎么办 支付宝异地登录解决办法
来源:百事网
编辑:若水若冰
支付宝登录异常怎么办?最近不少用户反应,自己的支付宝客户端总是收到安全提醒,称账号出现异地登录,需修改登录密码,这让人总觉得自己的账号是不是被盗了,这种现象我们该如何解决呢?
支付宝异地登录解决办法对此,支付宝官方回应称,遇到此情形的,是用户的其他网站或邮箱泄漏后,其密码与支付宝登录密码相同造成的,但不意味着会发生资金被盗。如果你修改了密码依然提示异地登录,说明新的密码仍然是自己的常用密码,建议支付宝使用一个单独的特殊密码,当然要牢记。不放心的,可以检查一下自己的支付宝登录记录,看看是否真的有异常(进入支付宝-&头像-&设置-&账户安全-&安全中心-&设备管理-&右上角问号-&左下角自助服务-&登录记录),或暂时解除银行卡绑定。