您当前的位置:首页 > 产品手册

如何实现用户登陆唯一性

  你可以这么干 1.在表结构里新增一个用户状态标示,当用户登录的时候,首先查看用户的当前处于什么状态,如果是未登录状态,直接允许其登录,如果是登录状态要求其验证登录信息

  2.新增一个数据结构( 表或者其他什么),跟踪当前用户,包括其浏览记录,操作记录等,记得要要记录请求来源及时间,通过监控程序计算最后一次操作时间判断用户是否失效,譬如:半小时或者1小时后,你检查到该用户未有任何操作,即可把其设置成未登录状态,或者要求其重新登录。如果在登录状态用户从不地方又登录上来,就验证其登录信息,验证正确,注销其另一处登录信息,重新设置登录信息;如果登录信息已失效,则直接登录

  3.针对关闭浏览器和退出系统及用户离开本网站页面做监控,一旦其离开就直接注销其登录信息,再打开时,要求其登录

  大致可以这样写 每次请求时 把最后操作时间写入数据库 如果长时间没操作 session就会失效 如果当前时间减去最后操作时间大于 session的有效时间时就把状态 改为未登录吧

  在用户表里增加个存放session的字段,用户登录时候,更新该用户的session(用户名+18位随机数),将(用户名+18位随机数)存放到session里,在里查找该用户数据库中的session字段,判断是否和session里的一致,不一致就提示“该用户在其他地方登录了”。

  本人做过账号唯一登录的,实际上这个并不能完全做到。做的不好会影响整个系统的session。如果仅仅是把登录账号放到session里面,然后下次登录判断session.get返回的永远是null。如果监听浏览器关闭,实际上也无法完全监听到。如果采用onunload,那么浏览器刷新、关闭、kill ie进程都可触发,如果监听close,那么kill ie进程就无法监听到。spring security虽然提供max-sessions进行配置,实际上也是无法做到唯一登录的,因为关闭IE时,spring security根本无法知道。

  为了防止我上面说的那种场景,可以检查IP,如果与前一次登录同一IP则允许admin登录并覆盖前一次登录。

  难点就是 如何在不点注销的情况下移除数据库里的数据。需要注册一个。session失效,由去做操作。

  把第一次admin登录的信息保存在application里,同时也保存其session会话的引用。在别外地方登录时查看application里是否已经有admin登录,如果有则不允许,但是为了防止前一次admin退出时是直接关闭浏览器的做法而不是销毁session,所以也要判断力一下前一次登录的session的最后活动时间,再比较一下现在的时间,如果时间差超出一定的时间(多少合理自己定)就认为是非正常退出(不是点击“退出”键退出),那么允许admin登录,并覆盖之前的admin登录信息,使前一次登录下线(销毁前一次session)。

  admin只有一个用户吧,保存在application也不会耗多少资源,也不需要在数据库里保存。只需要保存admin用户信息及session信息就可以了,在admin登录时检查这两项就够了,当然,做得更好一点,也可以加上IP的检查。

  如果只是判断一个用户的话,就如你所说admin,那么放在application中是最好的,因为只是一个用户信息,数据量不是很大。但是存放的时候要注意,用户信息放在第一次登陆的session中,然后将session的标识放在application中,当session失效时,要有一个listen来清楚application中的session标识,注意这个标识是唯一的。这样的话,当别人使用admin来登陆的时候,就可以从application中找到已经登陆的session标识,提示不可以再登陆,这样也能防止第一个登陆的人浏览器非正常关闭引起的问题。

  如果是所有的用户都需要唯一地点登陆的话,就需要使用数据库或者缓存机制了。数据库的话可以使用用户表中的标识位,不过这种方式会频繁的查询数据库,缓存机制的话就比较好一点,可以使用应用的内存空间,也可以使用专门的缓存的内存空间,比如说membercache之类的缓存机制,这些都需要session有一个监听,用来监听session失效,当session失效时清楚缓存中的用户信息。

  为什么放在session中呢?session的作用范围是跟用户相关的不是全局的,前面几个建议放在session中的是不是搞错了?

  应该放在application对象中,jkxydp 同学说的有点靠谱。另外要注意的是如果用户直接闭关浏览器而不是点击你的“退出”这种场景如何注销session

  将已登陆的用户构建一个hashMap key 为用户名,存放到application范围,在每次客户端有登陆用户的时候,就去application中取出hashMap,来检查用户名对应的key是否存在,这个过程执行效率极高,不存在证明没有在线,存在则证明在线、用户登陆时,session中需要记录用户信息,并将登陆的用户添加到application的hashMap中;

  2、session被销毁时,需要将hashMap中对应的用户名移除,以避免用户没有正常退出就永久不能登陆;

  在admin对象的表中添加一个字段用来表示当前用户是否已经登录,登录时候判断这个标识为没有登录状态才能允许登录,[size=x-small][/size]在第一个人用admin账号登录时候把标识改为已经登录,这样第二个人在第一个人admin账号没有退出的情况下,再登录就不能登录成功了。

来顶一下
近回首页
返回首页
一周人气文章排行榜
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
一周推荐文章排行榜
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

网站简介版权所有