使用特定于标签的Cookie而不使用sessionStorage或任何HTML5功能

ran*_*its 15 javascript php cookies

我感兴趣的是让用户能够在我的网络应用程序上登录并注销多个用户会话cookie.目前,身份验证是标准的,并且唯一标识符允许我在用户访问我们的站点时对其进行身份验证,如果他们提供了cookie中可用的身份验证令牌.典型用例适用于如果用户从一个选项卡注销,它会将其从另一个选项卡中注销.现在,它要求用户从两个独特的浏览器实例登录,以便能够登录到两个不同的帐户.

是否有非HTML5方式(使用标准javascript cookie)具有特定于标签的cookie标识符?我假设没有明确的方法来解决这个问题,它需要从后端进行某种黑客+合作.如果有一个没有使用HTML5的解决方案,那将是理想的.

Pra*_*eek 13

你不能.

有办法处理这种情况,但没有一种是简单的.

如果你愿意,你必须告诉用户这样做:如何极客

从文档: 使用的数据sessionStorage不会在浏览器选项卡中保留,即使两个选项卡都包含来自同一域的网页.换句话说,内部数据sessionStorage不仅限于调用页面的域和目录,还包含页面所在的浏览器选项卡.与会话cookie形成对比,会话cookie将数据从选项卡保留到选项卡.

  • @Samuel,这**几乎是正确的**。当调用“window.open”时,“sessionStorage”被**复制**到新选项卡/窗口。因此,只有在您更改其中任何一个之前,它们才具有相同的内容。(在 Chrome 和 Firefox 上测试) (4认同)
  • 请注意,例如,如果您使用浏览器的“重复选项卡”功能或“window.open”在同一源上打开一个新窗口,则两个窗口(可能是选项卡)将共享相同的“sessionStorage”(在 Chrome 和火狐)。 (2认同)

dm4*_*web 1

这是一个简单的示例,说明如何创建一个用户可以登录多个帐户的系统。这不是安全检查,必须添加。这段代码可以更好地编写和优化。

php

https://github.com/maksa9/multiple-user-login/blob/master/inc.php

该文件包含在每个 php 脚本中。

这部分检查哪个用户已登录以及哪个帐户处于活动状态。以下是根据活动帐户创建 php 脚本正确路径的函数

// check which user is logged and which account is active
if(isset($_GET['user'])) $id_user = (int)$_GET['user'];
if($id_user > 0)
{
    if(isset($_SESSION['user'][$id_user]))
    {        
        $user_name = $_SESSION['user'][$id_user]['name'];
        $user_email = $_SESSION['user'][$id_user]['email'];                
    }
    else
        gotToLoginForm();
}

// If the user id is not specified and there is a user session, finds another id
if($id_user == 0 and isset($_SESSION['user']))
{    
    $sess = $_SESSION['user'];

    $id_user = (int)key($sess);

    if(isset($_SESSION['user'][$id_user]))
    {        
        $user_name = $_SESSION['user'][$id_user]['name'];
        $user_email = $_SESSION['user'][$id_user]['email'];  

        define('ID_USER',$id_user);

        gotToIndex();              
    }
    else
        gotToLoginForm();

}

define('ID_USER',$id_user);
Run Code Online (Sandbox Code Playgroud)

登录表单.php

https://github.com/maksa9/multiple-user-login/blob/master/loginform.php

使用 post 方法登录的简单表单。

登录.php

https://github.com/maksa9/multiple-user-login/blob/master/login.php

登录用户。模拟对数据库的查询。

if(isset($_POST['email']))
    if(isset($_POST['pass']))
    {
        $email = $_POST['email'];
        $pass = $_POST['pass'];

        $id_user = 0;

        // simulates a query to the database
        if($email === 'test1@test.com' and $pass === '111')
        {
            $id_user = 1;
            $name='John Doe';
        }
        if($email === 'test2@test.com' and $pass === '222')
        {
            $id_user = 2;
            $name = 'Doe John';
        }

        // login user
        if($id_user > 0)
        {
            // checks if the user is already logged
            if( !isset($_SESSION['user'][$id_user]))
            {
                $_SESSION['user'][$id_user] = array('email'=>$email, 'name'=>$name);
            }

            //go to main page 
            $page = ROOT.'user/'.$id_user.'/index.php';            
            header('Location: '.$page);
            exit;

        }        
    }
Run Code Online (Sandbox Code Playgroud)

索引.php

https://github.com/maksa9/multiple-user-login/blob/master/index.php

应用程序的主页。

<div>
    <h1>Welcome: <?php echo $user_name ?> (<?php echo $user_email ?>) [<?php echo $id_user ?>]</h1>


    <p><a href="<?php echo returnUrl('swap.php',$id_user)  ?>">Choose an account</a></p>    
    <p><a href="<?php echo returnUrl('loginform.php',$id_user)  ?>">Login with the another account</a></p>        
    <p><a href="<?php echo returnUrl('logout.php',$id_user)  ?>">Log out</a></p>

</div>
Run Code Online (Sandbox Code Playgroud)

交换.php

https://github.com/maksa9/multiple-user-login/blob/master/swap.php

允许用户选择帐户。

foreach($_SESSION['user'] as $idus => $userA)
{
    echo '<p><a href="'.returnUrl('index.php',$idus).'">'.$userA['name'].' ('.$userA['email'].') ['.$idus.']</a></p>';
}
Run Code Online (Sandbox Code Playgroud)

注销.php

https://github.com/maksa9/multiple-user-login/blob/master/logout.php

注销用户。检查活动用户帐户并重定向它们(如果有)。

unset($_SESSION['user'][ID_USER]);

if(count($_SESSION['user']) == 0) 
    unset($_SESSION['user']);


// checks for active user accounts and redirects them if any
if(isset($_SESSION['user']))
{        
    $sess = $_SESSION['user'];

    $id_user = (int)key($sess);

    if(isset($_SESSION['user'][$id_user]))
    {            
        $page = ROOT.'user/'.$id_user.'/index.php';            
        header('Location: '.$page);
        exit;               
    }        
}    
Run Code Online (Sandbox Code Playgroud)

.htaccess

https://github.com/maksa9/multiple-user-login/blob/master/.htaccess

Options +FollowSymlinks
RewriteEngine On

RewriteRule ^user\/([0-9]*)\/index.php$ index.php?user=$1 [NC,L]
RewriteRule ^user\/([0-9]*)\/logout.php$ logout.php?user=$1 [NC,L]
RewriteRule ^user\/([0-9]*)\/login.php$ login.php?user=$1 [NC,L]
RewriteRule ^user\/([0-9]*)\/loginform.php$ loginform.php?user=$1 [NC,L]
RewriteRule ^user\/([0-9]*)\/swap.php$ swap.php?user=$1 [NC,L]

RewriteRule ^user\/$ index.php [NC,L]
RewriteRule ^user$ index.php [NC,L]
Run Code Online (Sandbox Code Playgroud)

  • @ChristianM.Raymonds 我不敢相信你是认真的。但每个人都有权表达自己的意见 (3认同)