`
beyondqinghua
  • 浏览: 41531 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

简单的单用户登陆实现例子

    博客分类:
  • JEE
阅读更多

 前段时间搞了一个简单的单用户登陆实现例子,虽然不能实现敏捷反应,但是对安全相对要求底的系统还是可以考虑的。

   具体原理:结合过滤器+Servlet监听器。
    ServletContext对象保存的是整个WEB应用程序的共享信息,那么如果用户登陆可以把用户的部分信息保存在ServletContext中。
   Servlet监听器可以监听用户过期或者注销,把用户信息从ServletContext中删除。
   那么,现在关键是如何设计保存在ServletContext中的用户信息:这里,由于用户的ID是唯一的,那么我们可以利用Map集合保存在线用户列表(由于Map内部是使用类似索引查询进行快速查找,所以效率还是比较高的),Map的key是UID,Object是一个包含 uid、name、serial、time(记录时间)四个必要信息。这里关键是serial、time两个属性,用户登陆时会产生一个唯一的随机码,如果此用户登陆后在别的地方登陆,那么就会修改这个随机码,这时原来登陆的用户在ServletContext中保存的随机码就改变了(与用户sesion中的随机码不同),那么其就被迫下线(这个工作由过滤器来做);那么time的作用是什么呢,它是减少过滤器的判断时间间隔,减少用户每个请求都进行一次从ServletContext中获取serial与session中的serial进行比较的过程,减少资源的开销。
   需要建立的数据对象类:User.java(用户session)、UList.java(ServletContext中的元数据);
  需要建立的servlet:Login.java;
  需要建立的filter:Check.java(判断用户的权限以及serial是否有效);
  需要建立的listener servlet:UserListener.java(web服务器启动时初始化用户列表到ServletContext中,用户登陆时把用户信息添加到ServletContext中,用户过期或者注销把用户信息从ServletContext中删除)。
   分析完毕,附实现源代码!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics