powerwind 发表于 2007-5-6 01:29

使用HttpSessionBindingListener实现Log记录

在网站中,一般要记录用户是什么时候登入和什么时候登出。对于登录进去时,可以在验证的同时向数据库写入信息,但是用户离开时可能直接关掉浏览器,想记录也记不了。

一般做法可能是从Session中入手,当Session失效时,就记录用户离开。使用HttpSessionBindingListener可以很方便地实现这个简单的功能。

下面是我的简单示例。



import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

import org.jvk.dao.LogDAO;

public class UserSession implements HttpSessionBindingListener {

      public void valueBound(HttpSessionBindingEvent event) {
                new LogDAO().log(name, ip, "登入");
      }

      public void valueUnbound(HttpSessionBindingEvent event) {
                new LogDAO().log(name, ip, "登出");
      }

      // 用户名
      private String name;
      // 用户组名
      private String groupName;
      // 用户IP
      private String ip;

      /* 省下面一些 getter 和 setter 方法 */

}


有了这个比较特殊的 bean 后,只要在验证用户登录时写多一些这样的代码:

                        UserSession userSession = new UserSession();
                        userSession.setName(name);
                        userSession.setGroupName("普通会员");
                        userSession.setIp(ip);
                        req.getSession(true).setAttribute(Constants.USER_SESSION,
                                        userSession);

一般来说,在用户登录后,我们总要在Session中保存些东西的。

为了快速测试代码,我在web.xml把Session的生命周期为1分钟。
      <session-config>
                <session-timeout>1</session-timeout>
      </session-config>

只要是和在线离线相关的,似乎都可以用这个方法。但是第一次用HttpSessionBindingListener这个接口,也不知道会有什么副作用。


去百度找下相关资料,再去谷歌搜一下。
闪人!

[ 本帖最后由 powerwind 于 2007-5-6 01:32 编辑 ]

powerwind 发表于 2007-5-6 02:01

从百度和谷歌中回来,发现HttpSessionBindingListener用得还不算少,有人专门用来记录在线人数,有人用来保存数据库连接(多人的话一定出问题),有人用来防止用户重复登录。但不管怎样,都是用到它在Session生效失效或属性变化时触发事件的特性。

不好的地方就是有人说,WEB容器不能做到100%保证HttpSessionBindingListener的事件都正确触发。
页: [1]
查看完整版本: 使用HttpSessionBindingListener实现Log记录