一个用PHP写的网站,当两个人同时用一个账号登录时,后一个会将前一个账号挤下线。

需要一个session id,与用户信息绑定。

比如3L的说法,在users表内加一个sessionId字段,在用户访问时将cookies里面的sessionId与数据表里的sessionId比较下,不同就是非法访问,这时候踢下线就是把sessionId置空。

也可以单独创建一个 sessions 表,在里面记录用户ID与对应的session id ,登陆时查询下记录——这样的好处是支持多个地方同时登录同一个用户。T下线的方法是删除sessions表里对应的session id或用户ID。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现同一个账号只能有一个在线的方法有很多种,其中一种比较常见的做法是使用token机制,在用户登录生成一个token,并将其存储在服务端,同将token返回给客户端。客户端在后续的请求中需要携带该token,服务端验证token的有效性,从而判断用户是否已经登录。 在实现踢下线的功能,我们可以在用户登录将其token与账号信息存储到一个全局的Map中。当用户再次登录,我们可以先从Map中查找是否存在该账号的token,如果存在,则说明该账号已经登录,我们可以将其对应的token删除并让其下线,然后再将新的token存储到Map中,以保证同一个账号只能有一个在线。具体实现可以参考以下代码: ```java @Component public class UserLoginInterceptor extends HandlerInterceptorAdapter { // 存储token和账号的映射关系 private static final Map<String, String> TOKEN_MAP = new ConcurrentHashMap<>(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); if (StringUtils.isNotBlank(token)) { String username = TOKEN_MAP.get(token); if (StringUtils.isNotBlank(username)) { // 说明该账号已经登录,将其踢下线 TOKEN_MAP.remove(token); // TODO: 发送下线通知 } // 将新的token存储到Map中 TOKEN_MAP.put(token, username); } return true; } } ``` 在上述代码中,我们使用了一个ConcurrentHashMap来存储token和账号的映射关系。在用户请求到达,我们首先从请求头中获取token,然后在Map中查找该token对应的账号信息。如果存在该账号信息,则说明该账号已经登录,我们可以将其踢下线。最后,我们将新的token存储到Map中,以保证同一个账号只能有一个在线。需要注意的是,我们在删除旧的token之可以发送一个下线通知,以便让用户知道自己被踢下线了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值