【PHP】使用session控制同一个账户单设备登陆

首先使用一个浏览器来访问应用的一个页面 multex_session1.php

要记录当前账号所使用的sessionId,使用session_id()获取到当前的sessionId

然后用另一个浏览器和同一个账号访问另一个页面 multex_session2.php

在该页面中会找到该账号之前使用的sessionId,然后清除该sessionId保存的所有内容,然后重新写入session值,并将新的sessionId写入redis中

清除旧的sessionId使用的方法有 session_start()????? ?session_unset() ? session_write_close()

具体代码:multex_session1.php

<?php

    $redis = new Redis();
    $redis->connect('192.168.1.102',6379);
    session_start();
    $curSessionId = session_id();
    echo 'sessionId='.$curSessionId.'<br/>';
    $userSession = $redis->get('online:1');
    echo "userSession:{$userSession},user_id:{$_SESSION['user_id']},user_name:{$_SESSION['user_name']}";

    $_SESSION['user_id'] = 1;
    $_SESSION['user_name'] = 'areyouok';

    $redis->set('online:1', $curSessionId);
    $redis->expire('online:1', 1800);
    session_write_close();

multex_session2.php

<?php
    session_start();
    $curSessionId = session_id();
    echo 'sessionId='.$curSessionId.'<br/>';
    session_write_close();

    $redis = new Redis();
    $redis->connect('192.168.1.102',6379);
    $oldSession = $redis->get('online:1');
    if (!empty($oldSession) && !empty($curSessionId) && $curSessionId != $oldSession) {
        echo 'oldSession not equal new sessionId<br/>';
        $redis->set('online:1', $curSessionId);
        $redis->expire('online:1', 1800);

        session_id($oldSession);
        session_start();
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            echo 'arrive here,'.json_encode($params).'<br/>';
            setcookie(session_name(), '', time() - 42000,
                $params["path"], $params["domain"],
                $params["secure"], $params["httponly"]
            );
        }
        unset($_SESSION['user_id']);
        unset($_SESSION['user_name']);
        session_unset();
        session_write_close();

        session_id($curSessionId);
        session_start();
        echo "oldSession:{$oldSession},user_id:{$_SESSION['user_id']},user_name:{$_SESSION['user_name']}";
        $_SESSION['user_id'] = 1;
        $_SESSION['user_name'] = 'areyouok';
        session_write_close();
    }

原文地址:https://www.cnblogs.com/richerdyoung/p/12243465.html

时间: 2024-08-30 15:54:06

【PHP】使用session控制同一个账户单设备登陆的相关文章

JavaWeb学习总结(十一):Session解决form表单重复提交

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML>

微信小程序通过低功率蓝牙控制单片机上硬件设备

1.软件部分介绍 微信小程序是一种新的应用,用户不需要下载应用只用通过扫二维码或者打开链接就能使用,使用完后不需要卸载,直接关闭就行了.微信在2017年初推出微信小程序开发环境.任何企业,媒体,个人都可以注册开发.是一种全新的 开发模式.微信也因此受到许多程序员的一致好评,尤其是微信小程序的云开发,提供大量数据处理接口,让初学者也可以很快入手.不需要后端数据库的支持,自己一个人就可以开发前端和后台. 微信小程序为蓝牙模块提供了18个API.其中低功率蓝牙9个,传统蓝牙9个.本次设计使用了其中的9

ASP.NET MVC中使用Session来保持表单的状态

本篇实践在ASP.NET MVC 4下使用Session来保持表单的状态. 本篇的源码在这里: https://github.com/darrenji/KeepFormStateUsingSession 如上,输入俱乐部名称,点击"添加球员",输入球员名称.我们希望,点击"到别的地方转转"跳转到另外一个视图页,当再次返回的时候能保持表单的状态. 点击"到别的地方转转"跳转到另外一个视图页如下: 再次返回,表单的状态被保持了: 点击"提交

[Java][Spring][scurity]同步session控制,防止一个用户多次登录

[Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1.你须要把以下的监听器加入到你的web.xml文件中,让Spring Security获得session生存周期事件: <listener> <listener-class> org.springframework.security.ui.session.HttpSessionEvent

JS控制submit表单提交前进行预览和confirm确认提交

JS控制submit表单提交前进行预览和confirm确认提交. 我们经常会遇到这样的场景,某一个form表单提交前,想知道那些checkbox的内容被选中了,如果符合则提交,如果不符合,则取消提交,很简单的代码,我就不说了,直接上代码了. <script type="text/jscript"> $(document).ready(function() { //alert($("input[name='xinjiu']:checked").val())

抽象工厂 控制EF上下文 单例

public class ObjectContextFactory { public static System.Data.Objects.ObjectContext GetCurrentObjectContext() { //从CallContext数据槽中获取EF上下文 ObjectContext objectContext = CallContext.GetData(typeof(ObjectContextFactory).FullName) as ObjectContext; if (o

3YAdmin-专注通用权限控制与表单的后台管理系统模板

3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及错误信息收集这三大块,前两个最为重要.而GitHub上的大多数项目关注点都不在这里,各种第三方组件堆砌在一起,看起来很炫酷,但是实用性没多大,改起来也麻烦(如果是vue,可以看我的另一个项目vue-quasar-admin). 有人可能会有疑问:权限控制,不同系统实现不一样,根本没法做到通用.权限控

用java实现一个简单的单用户登陆功能的思路

引用 所谓"单用户单账户登录"是指:在同一系统中,一个用户名不能在两个地方同时登录. 我们参照 QQ 实现效果:当某账号在 A 处登录后,在未退出的情况下,如果再到 B 处登录,那么,系统会挤下 A 处登录的账号. 要实现这样一个功能,如果我们项目使用了springmvc我们可以使用拦截器来替代过滤器,否则我们使用过滤器也可以实现,我们需要一个这样的东西来进行拦截用户的请求.我们的user表里也需要添加一个token字段,用于存放当前登录者的一个唯一标识. 大致的思路是这样的: 用户A

centos 单用户登陆模式操作

在centos中因为安装java而配置 jdk环境变量的原因,对/etc/profile文件进行了编辑 错误的环境变量配置导致在第一次修改profile文件并保存后,执行source /etc/profile 命令后进行测试 即:javac /java/ java -version   都可以得到正确的验证结果; 随机重启系统 在再一次到达登陆页面的时候出现了异常:选择登陆用户点击(正确的 是出现输入密码的窗口)后,又马上(时间可以忽略)返回选择用户窗口, 不能进行登陆,界面只有显示等待的钟表,