最后登录时间记录的一点思考

原创
2013/07/29 19:54
阅读数 431

    刚做的时候感觉这最后登录时间根本不在设计的范围内,也许也只有我这种初出茅庐的人才会这么想吧。没有做过设计,实习了一年,刚毕业就辞职了(同学都惊呆了,说我二了!),敲代码也只是限于服务层,控制层,再底下估计人家包装好了你看也甭想看。额。。每次写笔记都会有一段感慨!!

    最后登录时间我设计的时候是在用户表里的只有一个字段,网上有人说设计两个字段来做件事情,我就不相信了还非得两个字段来做,麻烦。当然网上也有很多方法来设计这个登陆时间,怎么说呢测试都失败了。我还是自己想吧但人家的思路可以借鉴。

    首先最后登录时间是用户登录时的时间,这个毫无疑问!但这时我犯了一个自认为愧对学习了一年web开发的错误。

    问题:

    登录--成功---user对象放入session域---set最后登录时间为当前时间---update---跳转到页面!!

    在红色的部分就是问题的错误所在。分析,用户对象只有一个,修改了最后登录时间把值传到页面后这个最后登录时间就成了当前时间。这个错误太二了。

    思路:

    用户创建后要保存到session中因此我们就会想到用session监听器来做这件事,session创建得到日期,session结束保存更新结果。OK思路有了!

    解决办法:

    实现HttpSessionAttributeListener接口来监听session的创建销毁和修改,因为这个接口可以接收session中属性的改变。主要做的东西在attributeRemoved这个方法中。我还在用户类中放入flagLastLoignTime作为临时属性,不生成映射。

public void attributeRemoved(HttpSessionBindingEvent se) {
   if("user".equals(se.getName())){
	User user = (User) se.getValue();
	String hql = "update User u set u.lastLoginTime=? where u.id=?";
	ApplicationContext applicationContext = SpringInit.getApplicationContext();
	UserService userService = (UserService) applicationContext.getBean("userServiceImpl");
	userService.update(hql,user.getFlaglastLoginTime(),user.getId());
   }
}

    用户登录后给临时属性赋值保存在sesssion中,当session过期时就会执行attributeRemoved方法,当然得判断一下是不是移除用户对象,如果移除的是用户则通过se.getValue得到移除的这个对象。注意一下当注销登录可以从session中获到对象,但session失效是不行的,所以必须用se.getValue来获得移除的这个对象即用户对象。然后得到用户的ID,和刚赋值进去的临时变量更新数据库吧。

    好吧!!一个问题解决一下午!!这进度哎!!各种不给力!

   

展开阅读全文
打赏
0
5 收藏
分享
加载中

引用来自“奇山”的评论

引用来自“zhaoxj”的评论

引用来自“奇山”的评论

如果暴力关掉java容器(例如执行kill命令关闭tomcat进程),而不是通过./shutdown关闭的话,那岂不是不能执行session监听了?

额。。这个确实是。。但没事去服务器上关kill tomcat干吗!!

只是想提醒一下,这样实现在异常情况下容易出问题,例如tomcat宕机的情况。

那您有什么好的思路吗?
2014/08/26 08:16
回复
举报

引用来自“zhaoxj”的评论

引用来自“奇山”的评论

如果暴力关掉java容器(例如执行kill命令关闭tomcat进程),而不是通过./shutdown关闭的话,那岂不是不能执行session监听了?

额。。这个确实是。。但没事去服务器上关kill tomcat干吗!!

只是想提醒一下,这样实现在异常情况下容易出问题,例如tomcat宕机的情况。
2013/08/06 09:40
回复
举报
zhaoxj博主

引用来自“奇山”的评论

如果暴力关掉java容器(例如执行kill命令关闭tomcat进程),而不是通过./shutdown关闭的话,那岂不是不能执行session监听了?

额。。这个确实是。。但没事去服务器上关kill tomcat干吗!!
2013/08/05 20:01
回复
举报
如果暴力关掉java容器(例如执行kill命令关闭tomcat进程),而不是通过./shutdown关闭的话,那岂不是不能执行session监听了?
2013/08/05 11:45
回复
举报
更多评论
打赏
4 评论
5 收藏
0
分享
返回顶部
顶部