php session被覆盖问题

如果写一个网页,用$session[‘用户’]来登记登录的用户名,判断其是否存在,跳转登录界面,操作的时候,当前用户都是调用$session[‘用户’]这一变量的,比较方便。
但是,我在一个用户已经登陆的情况下,同一浏览器内,登陆另一个账号,则$session[‘用户’]会被覆盖,原先的登陆也就是失效了,有什么好的解决办法可以做到在同一个浏览器中实现多个用户登录并且不互相影响嘛?

最佳答案

仅是为了测试的话建议别折腾了,原理是 session_id() 函数,如果不传参默认是新开辟自动生成的 sessionid,如果传参则打开指定的 sessionid,可能难以实现,仅说明原理,示例

<?php
ini_set('session.gc_maxlifetime', 3600);
// 传入某个 sessionid
if (isset($_GET['sid']))
{
    // 这块不能任意让用户生成无限个session文件,需要维护
    session_id($_GET['sid']); //设置当前会话的 ID
    session_start(); // 打开这个 ID 的 session(也就是打开以这个ID命名的文件)

    if ($_SESSION['user'] == null)
    {
        die('未登陆');
    }
    var_dump($_SESSION['user']);
}
// 如果没传参,则生成一个 sessionid,这块要维护生成的SID
else
{
    // 账号密码登陆
    $sid = time();
    session_id($sid);
    session_start(); // 开辟一个用户区域(产生一个新的文件)
    $_SESSION['user'] = 'user:' . $sid;
    header("location: /1.php?sid=" . $sid);
}

此时同一浏览器打开2个窗口,分别访问 http://ip/1.php

file

file
当传不存在的sid时提示未登陆

PHP

查看session 文件,可见同一浏览器有两个 session 文件

file

4个月前 评论
JHline (楼主) 4个月前
讨论数量: 16

比较难

用隐私模式倒是可以登录2 个账号

php 的 session 是基于 cookie 来区分 session 的。

4个月前 评论
JHline (楼主) 4个月前
kis龍 (作者) 4个月前
kis龍 (作者) 4个月前
JHline (楼主) 4个月前

不能,可以用多种浏览器登录不同账号 :blush:
还有个问题,你既然都登录了,还可以进登录页面,这个…

4个月前 评论
JHline (楼主) 4个月前

存好存。$_SESSION['users'][] = $uid; 数组嘛。

但是怎么取呢?需要你设计。

比如,【我的】个人中心,两个登录用户,显示谁的信息?切换用户身份?那也是session嘛。$_SESSION['users'][] = $uid1; $_SESSION['current_uid'] = $uid1; 页面有个地方显示 当前已登录的所有用户身份列表,点击切换,点击跳转到/role/change?to_uid=xx。在这里判断if(in_array($_GET['to_uid'], $_SESSION['users'])) $_SESSION['current_uid'] = $uid1;

4个月前 评论
JHline (楼主) 4个月前

用redis来存储登录状态进行区分

4个月前 评论
JHline (楼主) 4个月前

建议直接多浏览器测试,因为单一浏览器多用户登陆是个很复杂的流程,还涉及到逻辑的修改,实现后仅仅是测试,不划算~

4个月前 评论
JHline (楼主) 4个月前

使用url传送会话id:传送会话ID

此种有安全风险,谨慎使用。

4个月前 评论

仅是为了测试的话建议别折腾了,原理是 session_id() 函数,如果不传参默认是新开辟自动生成的 sessionid,如果传参则打开指定的 sessionid,可能难以实现,仅说明原理,示例

<?php
ini_set('session.gc_maxlifetime', 3600);
// 传入某个 sessionid
if (isset($_GET['sid']))
{
    // 这块不能任意让用户生成无限个session文件,需要维护
    session_id($_GET['sid']); //设置当前会话的 ID
    session_start(); // 打开这个 ID 的 session(也就是打开以这个ID命名的文件)

    if ($_SESSION['user'] == null)
    {
        die('未登陆');
    }
    var_dump($_SESSION['user']);
}
// 如果没传参,则生成一个 sessionid,这块要维护生成的SID
else
{
    // 账号密码登陆
    $sid = time();
    session_id($sid);
    session_start(); // 开辟一个用户区域(产生一个新的文件)
    $_SESSION['user'] = 'user:' . $sid;
    header("location: /1.php?sid=" . $sid);
}

此时同一浏览器打开2个窗口,分别访问 http://ip/1.php

file

file
当传不存在的sid时提示未登陆

PHP

查看session 文件,可见同一浏览器有两个 session 文件

file

4个月前 评论
JHline (楼主) 4个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!