我用PHP实现一个账号只能同时在同一个设备登录,注意,不是同一个IP。

之前是在MYSQL的表中加了个显示是否登录了的字段,若登录了设置为1,退出设置为0.

但后来发现,强行关闭浏览器的时候就没办法把这个字段设置为0了!

想了很久没想出解决方案,后来在网上看到好像可以用redis来实现,于是这两天开始学redis。但发现这样学下去也没有什么思路啊。

所以上来请教一下,请问有谁有经验的可以说一下怎么实现吗?谢谢!祝大家中秋节快乐!

回复内容:

我用PHP实现一个账号只能同时在同一个设备登录,注意,不是同一个IP。

之前是在MYSQL的表中加了个显示是否登录了的字段,若登录了设置为1,退出设置为0.

但后来发现,强行关闭浏览器的时候就没办法把这个字段设置为0了!

想了很久没想出解决方案,后来在网上看到好像可以用redis来实现,于是这两天开始学redis。但发现这样学下去也没有什么思路啊。

所以上来请教一下,请问有谁有经验的可以说一下怎么实现吗?谢谢!祝大家中秋节快乐!

如果是 Redis 的话, 可以使用 hash 结构来存储账户登入信息.

hash 的结构: key field value

hash 相关使用命令 http://redisdoc.com/hash/inde...

具体实现:

hash 结构中, 使用相同的 key field 写入数据时, 会覆盖掉历史数据

Redis> hset key field Test

Redis> hget key field

"Test"

Redis> hset key field Run

Redis> hget key field

"Run"

这样就能实现单个账户的需求, 指定一个 key 用来存储账户登入信息, field 就是每个账户的主键, 那么每次登录都会将上一次的登入信息清空, 之前的登入信息就失效了, 这样就能达到之前的登录状态失效.

如果考虑到不同设备的登录, 可以将 field 变为 devicename-uid 这种形式, 保证一个设备只能够有一个登录信息存在.

你要知道你需要什么?

单点登录还是限制单设备

单设备是同一台电脑多个浏览器?

关于使用mysql的一种解决方法

如果不考虑效率,只需要在mysql中你原有的记录是否已登录的字段旁再增加过期时间和设备唯一标识符两个字段,将以前的判断是否登录的条件由“是否为1”变为“是否为1且未过期且设备唯一标识符一致”。每次用户有操作时都更新过期时间的值,如果一段时间没有操作,登录状态就可以“自动”过期,这样就可以解决你的“强行关闭浏览器的时候就没办法把这个字段设置为0了”的问题。

使用phpredis进行简单实现

如果你刚接触redis,且仅仅需要用redis做用户登录的控制,对于数据结构,你不是很了解,string类型即可满足你(如果可以,使用hash可能会更好)。

下面以phpredis扩展提供的相关类作为背景,进行描述:

假设某一用户id为100的账户登录,向redis中记录登录设备信息

connect($redisHost, $redisPort);

$cacheName = 'deviceUUID:user'.$userId;

$deviceUUID = getDeviceUUID(); // 假设有 getDeviceUUID() 函数用于获取/生成设备的唯一标识符

$timeout = 600; // 用户10十分钟无操作自动下线

$redis->set($cacheName, $deviceUUID);

$redis->setTimeout($cacheName, $timeout);

}

设备每次执行其它操作前,都需要更新redis中设备信息的过期时间

connect($redisHost, $redisPort);

$cacheName = 'deviceUUID:user'.$userId;

$deviceUUID = getDeviceUUID(); // 假设有 getDeviceUUID() 函数用于获取/生成设备的唯一标识符

$timeout = 600; // 用户10十分钟无操作自动下线

$cachedDeviceUUID = $redis->get($cacheName);

$isTimeout = false === $cachedDeviceUUID;

$isTheRightDevice = $deviceUUID === $cachedDeviceUUID;

if($isTimeout || !$isTheRightDevice){

return false;

}

$redis->setTimeout($cacheName, $timeout);

return true;

}

设备中用户账户退出时,需要清理redis中的该设备信息

connect($redisHost, $redisPort);

$cacheName = 'deviceUUID:user'.$userId;

$redis->delete($cacheName);

}

当然了,上面的使用string类型而不是散列类型来实现的解决方案在资源利用和效率上是不太合理的。如果你希望对redis有更深的了解和运用推荐你阅读《Redis IN ACTION》这本书。具体到php中使用redis,你可以选择使用phpredis扩展或predis。

前段时间做的一个项目大概也有这么一个东西,大概目的是只能有一个终端在登录这个账号,即不能一个账号多处同时登录。

解决办法是在数据库中添加了一个字段token,每次登录根据时间戳加其他的生成一个新的token,在整个过程中不断检测token,如果发生改变了,那说明有用户在别处登录。

数据库加个字段:临时的token;等登录后,这个临时的token会随机生成,同时用户会根据这个token生成对应的sesssion;当另外一个设备登录后,临时的token更新了;原有设备的session无法匹配数据库的token;就会自动跳出!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php如何同设备连接不上,一个账号同时只能在同一个设备上登陆相关推荐

  1. 一个账号同时只能在同一个设备上登陆

    关于使用mysql的一种解决方法 如果不考虑效率,只需要在mysql中你原有的记录是否已登录的字段旁再增加过期时间和设备唯一标识符两个字段,将以前的判断是否登录的条件由"是否为1" ...

  2. 如何将Onenote上一个账号里的东西导到另一个账号里

    如何将Onenote上一个账号里的东西导到另一个账号里 工具:电脑版onenote(如图) 1.打开onenote,确保要操作的两个账号等登上了. 2.点击一下你现在笔记本的名字.(就是我打箭头的地方 ...

  3. 如何限制一个账号同时只能一个人登录

    一直以为 限制一个账号同时只能一个人登录 就是单点登录,经过网上查询,一个账号同一时间只能一个人登录和单点登录根本不是一回事. 解决思路: 在数据库中创建一个内存表member_sessionid(即 ...

  4. 物联网设备连接的下一个引爆点:4G Cat.1

    不看这几篇好文,就别说自己了解物联网 一.背景 物联网从概念兴起至今已经过了好几些年了.何为物联网,首先要定义何为"物"(Things),笔者理解所有具备连接能力的设备都可以是物, ...

  5. 手机或android设备连接电脑,但是adb devices找不到设备。

    android设备连接电脑后,在设备管理中Android devices出现android adb interface而未出现便携设备设备中.或者出现在串口设备有感叹号的情况.遇到过这种情况,adb连 ...

  6. jwt实现一个帐号只能同时在一个设备(端)登录的思路

    jwt的规范目前只检测jwt的发布者,过期时间,签名等信息.大部分现成的库都是按照标准写的.但是标准没有要求jwt带入登录时间等信息,因此用户连续登录多次,后台返回的token在有效期内都能访问后台a ...

  7. 字符设备驱动0:一个简单但完整的字符设备驱动程序

    参考: linux设备驱动程序之简单字符设备驱动 [很详细,必看]http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html //在驱动 ...

  8. 一个账号限制只能同时一个人登录

    最简单的测试办法就是用两个不同的浏览器登录,例如:用火狐浏览器登陆后再打开谷歌浏览器登陆,再回去刷新火狐浏览器时账号应该已经掉线了. 实现起来也很简单,在登陆时校验账号密钥正确后先查询用户的sessi ...

  9. 搞定企业视频直播:硬件设备、直播网络环境和设备连接说明

    阿酷TONY  / 2022-11-22  / 原创  /  长沙  / 目录 1.直播硬件设备 2.直播网络环境 3.直播设备连接 ├─A.双机位摄像机视频直播场景 └─B.单机位摄像机视频直播场景 ...

最新文章

  1. C语言字符串大小写转换_只愿与一人十指紧扣_新浪博客
  2. linux Telnet远程登录
  3. js修改mysql数据库数据_Node.js操作mysql数据库增删改查
  4. 51CTO博客 NO.1 大奖赛之后感想---奖品
  5. Go语言,在Ubuntu9.10和Windows安装
  6. Linux vi 行尾 ctrl,linux中vi使用技巧常用技巧和高级替换
  7. UI干货素材|app切换开关模块
  8. AD19自动布线出错,有些线未连接
  9. 使用pygal.maps.world库读取JSON格式文件,显示世界人口地图图示
  10. 目标检测(十八)--FPN
  11. Android Button 实现透明 + 圆角按钮效果
  12. android手机的mqtt测试工具,sIoT及安卓app实现mqtt实验
  13. eclipse配色方案
  14. 三国演义人物出场次数统计
  15. 根据手势拿到superview
  16. 各种蔬菜水果中英文名称对照
  17. 计算机网络: 同步传输和异步传输(理解)
  18. 《Adobe Premiere Pro CS6中文版经典教程》——复习题
  19. js 天花板 playcanvas
  20. 夜神模拟器连接手柄无反应_为何我的夜神模拟器连接了手柄却用不了

热门文章

  1. 移动端开发碰到一个坑
  2. mysql 重置root密码
  3. [推荐]SharePoint开发WebCast
  4. c++函数不写return可以吗_Science: 高剂量的维生素C可以抗癌吗?
  5. html任务清单源码,JavaScript jQuery 任务清单 ToDoList
  6. java runtime shell_java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现...
  7. 【Python】调用百度云API人脸搜索服务 Face Search
  8. 【控制】《多无人机协同控制技术》周伟老师-第6章-基于预测控制的无人机编队运动控制策略
  9. 【数理知识】《矩阵论》方保镕老师-第6章-广义逆矩阵及其应用
  10. 【Matlab 控制】求左右特征向量