系统登录、登出保存日志问题

最近有个需求,系统登录进来保存用户 登录日志的信息,有做过的请指教一下。。

0

8个回答

[quote]现在要这样实现了,登录进来记录用户信息,当用户退出时 就修改记录的用户信息,我感觉这不大合理呀。要修改,我根据什么修改呀。[/quote]

只是说记录用户的登陆状态,没必要修改用户信息啊,你再重建一张用户状态表,每个用户一个状态,用户登陆退出的时候,只修改对应的状态信息,只不过多加了一个update操作而已。

0

这个就是设计一个数据库表在用户登录时把它的登录时间,ip地址,用户名等等记录到数据库中。用户登录成功后将用户的登录信息写到数据库中。做的高级点的erp软件还能把用户做了哪些操作记录下来。
大致思路:
1.根据日志设计数据库表
2.登录成功,把登录信息写到表中。
3.用户推出或者注销把用户的注销,退出信息写到表中。

如果想做一个单点登录系统,登录时检测用户是否是活跃状态,是的不让登录,那这个就是单点登录了(SSO)
关于SSO可以参考参考:
url:http://www.cnblogs.com/luiweiping002/archive/2009/10/26/1649266.html

0

给你一个简单的例子,这样好下手:

JBuilder2005实战JSP之日志和部署.用户登录和退出日志
[url]http://www.uml.org.cn/j2ee/200601135.htm[/url]

0

使用aspectJ 的aop嘛。。。
很简单

0

  当用户登录系统时,在日志表中插入一条记录,记录用户登录的时间,在用户退出系统时记录用户退出系统的时间。

  我们利用HttpSessionBindingListener接口来完成记录登录和退出日志的功能,该接口中定义了两个方法:

  ·valueBound(HttpSessionBindingEvent event)

  ·valueUnbound(HttpSessionBindingEvent event)

  如果一个类实现了HttpSessionBindingListener接口,当对象通过session.setAttribute()被绑定到Session中时,则对象的接口方法valueBound()被自动调用,当对象从session中移出时(通过调用session.invalidate()、session.removeAttribute()或session自动过期时),valueUnbound()方法将被自动调用。

  下面我们使User.java类实现HttpSessionBindingListener接口,调整后的代码如下所示:
[code="java"]
package bookstore;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.sql.*;
import java.text.SimpleDate表单at;
import java.util.Date;

public class User implements HttpSessionBindingListener
{
 …
 private String loginDatetime;//用户登录时间
 …
 public void valueBound(HttpSessionBindingEvent event)
 {
  Connection conn = null;
  String sqlStr = "insert into T_LOGIN_LOG(ID, USER_ID, DT_LOGIN) " +
      " values(SEQ_LOGIN_LOG_ID.NEXTVAL,?,? )";
  try
  {
   conn = DBConnection.getConnection();
   PreparedStatement pStat = conn.prepareStatement(sqlStr);
   loginDatetime = getCurrDatetimeStr(); //当前时间串
   pStat.setString(1, userId);
   pStat.setString(2, loginDatetime);
   pStat.executeUpdate();

  } catch (SQLException e)
  {
   throw new RuntimeException(
    "用户登陆日志写入出错");
  } finally
 {
 try
 {
  if (conn != null)
  {
   conn.close();
  }
 } catch (SQLException ex)
 {
  ex.printStackTrace();
 }
 }
}

public void valueUnbound(HttpSessionBindingEvent event)
{
 Connection conn = null;
 String sqlStr = " update T_LOGIN_LOG set DT_LONOUT = ? " +
     " where USER_ID=? and DT_LOGIN = ?";
 try
 {
  conn = DBConnection.getConnection();
  PreparedStatement pStat = conn.prepareStatement(sqlStr);
  pStat.setString(1, getCurrDatetimeStr());
  pStat.setString(2, userId);
  pStat.setString(3, loginDatetime);
  pStat.executeUpdate();

 } catch (SQLException e)
 {
  throw new RuntimeException(
   "用户退出日志写入出错");
 } finally
 {
  try
  {
   if (conn != null)
   {
    conn.close();
   }
  } catch (SQLException ex)
  {
   ex.printStackTrace();
  }
 }
}

//获取当前时间字串,以yyyyMMddHHmmss格式返回,如20050505010101
private static String getCurrDatetimeStr()
{
 SimpleDate表单at sdf = new SimpleDate表单at("yyyyMMddHHmmss");
 return sdf.表单at(new Date());
}
}
[/code]

  valueBound()方法向T_LOGIN_LOG表插入一条登录日志,在valueUnbound()方法中更新日志表的退出时间,此外第80~84行提供了一个获取当前时间串的方法getCurrDatetimeStr(),通过该方法获取登录和退出时间点的时间字符串。

  下面通过描述用户登录系统直到退出时所经历的步骤说明程序如何记录用户的登录和退出时间的:

  1.用户通过login.jsp输入密码登录后,程序转向switch.jsp控制页面。

  2.在switch.jsp中,我们通过session.setAttribute("ses_userBean", userBean)方法将User.java类的对象userBean绑定到session中。

  3.此时userBean对象的HttpSessionBindingListener接口方法valueBound()被调用,向T_LOGIN_LOG表插入一条登录日志。

  4.switch.jsp转向welcome.jsp页面。

  5.用户点击welcome.jsp页面中的链接退出系统时,转向quit.jsp页面。

  6.quit.jsp调用session.invalidate()方法,userBean对象从session中清除。

  7.此时userBean对象的HttpSessionBindingListener接口方法valueUnbound()方法被调用,更新日志的退出时间,关闭浏览器窗口。

  HttpSessionBindingListener接口是Web容器的事件接口,实现接口的类在某个事件发生时自动被调用,Web容器有多个这样的事件接口,它们分别是:

  ·ServletContextListener 接口:Web容器启动和销毁的事件处理接口,接口中定义了两个方法。

  ·ServletContextAttributeListener接口:Web上下文属性发生更改时的事件处理接口。

  ·HttpSessionListener接口:Session创建和销毁事件的事件处理接口。

  ·HttpSessionAttributeListener接口:Session会话中属性对象更改的事件处理接口,该接口和我们在前面使用的HttpSessionBindingListener接口相似。

  此外在J2EE1.4中还提供了另外两个事件处理接口,它们是:

  ·ServletRequestListener接口:Request请求对象创建和销毁事件处理接口。

  ·ServletRequestAttributeListener接口:更改Request中属性对象时的事件处理接口。

0

这个问题我觉得嘛,重要的不是 代码 重要的是思路。登录时 你要记录什么信息,你需要设计成什么样的表结构,那些信息是你关注的很重要。这些弄清了。好的系统是设计出来的,编码只是其中的一个重要的环节。很多人只注重,有现成的代码吗?很多答题人又很有意思,其实自己也没有那些经验 上网随便搜一个 粘切上 这样不好。没有帮助!
三点很重要:
1.我需要实现那些需求,功能是什么,我关注那些信息
2.我想把它设计成什么样的比较合理,设计。
3.先实现一下,看看行不行,不行在改进。敏捷开发。

在实现过程中遇到了某些技术小问题,再各个击破。不就OK了吗!

0
wge83
wge83 顶,回答很好!
接近 7 年之前 回复

[code="java"]
现在我们项目中的日志实体类有这么几个属性:操作名称、操作人、操作状态、退出状态、操作时间、退出时间,当用户登录时,就新增一条信息,记录登录人,登录时间,状态,退出时就将新增的那条记录。请问这样行的通吗?帮忙指点一下。谢谢。补充一下,系统没有单点登录,也没有用spring的aop,就是简单的记录用户登录、登出信息。
[/code]

才看到了你的回复 不好意思。

没有单点登录你这个就比较简单。你的字段中需要记录一下登录IP这样把用户登录IP记录下来比较好。其他基本信息都有了。做起来还是比较简单。仔细考虑一下你的实际情况。把表结构设计合理后。再去设计记录信息的接口和方法。

0

[quote]如果用 HttpSessionBindingListener 实现的话,那我的user类必须实现这个接口???我们项目现在采用的是struts2 sping hibernate,如果我的user类实现HttpSessionBindingListener 接口,就得在user类中重写那两个方法,而且得用jdbc 保存的日志表中?我想在action这一层 中加入日志,如何实现?[/quote]

最主要的还是session销毁时(可能有N中情况诱发,如正常退出、关闭浏览器等),如何触发写日志的操作。

登陆时,日志可以随着用户名/密码的验证通过而写入。
退出时,如何利用session销毁事件写日志,这是一个难点,不实现HttpSessionBindingListener接口的话,就不好触发session销毁,如果自己写代码判断的话,可以在后台开一个扫描器,每个很短的一段时间判断一下session的状态,这样写起来麻烦,而且写不好的话,也耗费容器性能。

建议实现一下这个接口,反正接口是可以实现多个的。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!