• -------------------------------------------------------------
  • ====================================

如何监视在web应用中用户的登入与登出时间(原创)

建站指南 dewbay 5年前 (2019-04-12) 2586次浏览 已收录 0个评论 扫描二维码

在最近的工作中,由于为系统修改 bug,发现了这样一个问题 在我们现存的一个系统中存在以下一个需求: 当用户登录成功时,会记录用户的登陆时间,当用户登出这个系统时,记录登出系统的时间,该时间记录在日志中供用户进行查询。 这是一个很普通的用户需求,在这个系统中,登陆成功后,将记录用户登录时间,当用户使用系统提供的”退出系统”按钮退出时,将触发一个事件进行记录用户登出系统的时间以及清空该用户 session 的操作。问题就出现在这里,在一般情况下,一个 b/s 结构的系统,用户在退出系统时的习惯,大多数是直接关闭页面,而不是使用系统提供的”退出系统”操作,因此,对于退出时间的记录就无法实现了。 那么,如何准确的记录用户登出的时间呢?这个是我今天要在这里讨论的问题。在 web 应用中,一般采用 session 来维护用户的信息,一个 HttpSession 的开始代表用户进入该系统,而该 HttpSession 的结束才说明该用户在该系统访问的结束。如果用户不是显式的调用 HttpSession.invalidate()方法的话,一个 HttpSession 是不会被认为结束的。因此我认为应该通过监视用户登录后绑定的 HttpSession 的方法来监视用户的登入与登出。这与一般的论坛记录当前在线用户的方法应该是相同的,如果不监视session,不考虑用户超时登出的情况,则在线人数可能会一直增加下去。 下面说明我用来解决该问题的方法:实际上,方法很简单。我定一个类实现了 HttpSessionBindingListener 的接口,该接口提供了两个方法 valueBound 和 valueUnbound,valueBound 表示当 session 与预定义的对象绑定时调用,valueUnbound 则为 session 与预定义的对象取消绑定的时候调用,当然如果 session 超时或者 invalidate 的时候都会被调用。定义了这个类后我们要做的就是将该监听器和 session 绑定到一起。使用 HttpSession.setAttribute(“BinderObject”,new SessionBinder());这样的方法即可。在该方法执行后,程序将调用 valueBound 方法。而当执行 HttpSession.invalidate()方法后或者 session 超时以后,程序将调用 valueUnbound 方法,这样就可以通过定义这两个方法的方法体实现记录登入和登出时间或者其他的操作了。 以下是部分相关代码:


import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;public class SessionBinder implements HttpSessionBindingListener {

    private String logId = “”;//将 logId 在加载 session 的时候进行记录,是因为当调用 valueUnbound 的时候无法在获取 session 中的信息    public void valueBound(HttpSessionBindingEvent event) {
        logId = (String)event.getSession().getAttribute(“logId”);
        System.out.println(logId+”Login successful”);
    }    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println(logId+”Login out!”);
            if (logId != null) {
              //记录 logout 时间         }
    }}


在登陆成功后绑定 session

request.getSession().setAttribute(“logId”, logId);

request.getSession().setAttribute(“BinderObject”,new SessionBinder());


登出时调用 invaldate,取消 session 的绑定           

request.getSession().invalidate();


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何监视在web应用中用户的登入与登出时间(原创)
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址