网站后台限制用户在多电脑、多浏览器同时登陆?
http是无状态的.只能间接判断
对于web.qq.com这种实时要求高的web应用可以"实时"轮询.用户登录时,可以判断clientA的hashTable[uid].session最后访问时间.如果最后访问时间在轮询时间范围内(比如5s),说明用户之前的会话还没有结束.对于实时要求不高web应用,因为没有轮询.用户突然关闭了clientA(比如kill浏览器).30分钟后,用户又在clientB登录,服务器最多能知道30分钟前用户还有sessionA的活动但不能判断这个session是否结束.我想可以暴力的清除sessionA
由于HTTP是无状态的连接,所以要100%做到这个限制可能会有些困难,提供一些思路吧:1. 用户如果登录了,就使用一个大的Hash表,记录下来sessionid和用户id的对照信息(当然了,session里面同时也可以放置用户信息)2. 当用户点击“退出”的时候,清除hash表中这个用户的记录3. 如果用户请求登录,检查hash表中的用户id和sessionid是否是当前的用户id和sessionid,如果相同,则表示同一个终端上来的,否则就视为不同的终端4. 在Java中有SessionListener可以监听session的销毁,不知道PHP是否有这样的接口可用。当session销毁的时候,同时清理hash表中的对应记录5. 说实话,一个website设置这样的功能其实很让人烦的……所以,请楼主三思啊!
帝国cms,后台有这方面的使用。
用户数据表,建立一个登录认证随机字段。用户登录的时候,生成一个随机值,生成规则:随机值 = md5(IP地址+时间戳+客户端环境+登录用户信息)。登录成功,生成随机之后,修改该登录用户数据表登录认证随机字段的值,同时也将这个随机值,通过cookies保存到用户浏览器中。每次操作都从数据库读取给用户的登录认证随机值和保存在coolies中的随机值比较是否相等。如果相等,说明当前只有1个人使用,如果不等的话,就提示有其他人登录,你这边直接就退出了。
这个很简单,将session存储在数据库中,用户登录的时候先去数据库中根据用户名查询session记录,如果已经存在说明登录过了.数据库中sessionid为主键,同时包括浏览器的useragnet,还有登录的ip等数据。当然数据库中的session记录要有定时删除机制.
直接数据库里边一个字段,表示在线状态,登陆处理的同时,更改数据库状态,再次登陆的时候处理状态就好了。但是这种,无法处理url直接带上了sessionid的情况。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(5)
http是无状态的.只能间接判断
对于web.qq.com这种实时要求高的web应用可以"实时"轮询.用户登录时,可以判断clientA的hashTable[uid].session最后访问时间.如果最后访问时间在轮询时间范围内(比如5s),说明用户之前的会话还没有结束.
对于实时要求不高web应用,因为没有轮询.用户突然关闭了clientA(比如kill浏览器).30分钟后,用户又在clientB登录,服务器最多能知道30分钟前用户还有sessionA的活动但不能判断这个session是否结束.我想可以暴力的清除sessionA
由于HTTP是无状态的连接,所以要100%做到这个限制可能会有些困难,提供一些思路吧:
1. 用户如果登录了,就使用一个大的Hash表,记录下来sessionid和用户id的对照信息(当然了,session里面同时也可以放置用户信息)
2. 当用户点击“退出”的时候,清除hash表中这个用户的记录
3. 如果用户请求登录,检查hash表中的用户id和sessionid是否是当前的用户id和sessionid,如果相同,则表示同一个终端上来的,否则就视为不同的终端
4. 在Java中有SessionListener可以监听session的销毁,不知道PHP是否有这样的接口可用。当session销毁的时候,同时清理hash表中的对应记录
5. 说实话,一个website设置这样的功能其实很让人烦的……所以,请楼主三思啊!
帝国cms,后台有这方面的使用。
用户数据表,建立一个登录认证随机字段。
用户登录的时候,生成一个随机值,生成规则:随机值 = md5(IP地址+时间戳+客户端环境+登录用户信息)。
登录成功,生成随机之后,修改该登录用户数据表登录认证随机字段的值,同时也将这个随机值,通过cookies保存到用户浏览器中。
每次操作都从数据库读取给用户的登录认证随机值和保存在coolies中的随机值比较是否相等。
如果相等,说明当前只有1个人使用,如果不等的话,就提示有其他人登录,你这边直接就退出了。
这个很简单,将session存储在数据库中,用户登录的时候先去数据库中根据用户名查询session记录,如果已经存在说明登录过了.数据库中sessionid为主键,同时包括浏览器的useragnet,还有登录的ip等数据。
当然数据库中的session记录要有定时删除机制.
直接数据库里边一个字段,表示在线状态,登陆处理的同时,更改数据库状态,再次登陆的时候处理状态就好了。但是这种,无法处理url直接带上了sessionid的情况。