zoukankan      html  css  js  c++  java
  • php的cookie和session相同主域名共享

    如何使用chrome查看cookie和session详见另一篇文章,点这里

    首先说cookie,


    $cookieDomain = '.elf.com';
    setcookie('elf', 'im elf cookie', time()+300, '/', $cookieDomain);

    如上代码设置的cookie,在主域名为   elf.com的所有二级域名下都能访问该cookie。

    然后是session

    举例,login.elf.com,bbs.elf.com两个服务器,要实现login.elf.com登录后,bbs自动登录。

    login域名登录后写入session($_SESSION['USER'] = 2222),如果bbs能拿到login写入的session($_SESSION['USER'])不为空,就说明已经登录了。

    由于session的原理,bbs要拿到login的session要共享,需要两个条件

    1、拿到login的session id

    2、bbs服务器能访问login服务器上面的session数据。

    由于上面已经说了能共享cookie,如果login把自己的session id存放在主域名的cookie里,bbs域名就能通过cookie拿到login服务器的session id了。

    login服务器上面只需要这一行:

    setcookie('elf_PHPSESSIONID', session_id(), time()+300, '/', $cookieDomain);

    bbs服务器如下:

    $elf_PHPSESSIONID = $_COOKIE['elf_PHPSESSIONID'];
    
    session_start();
    
    session_id($elf_PHPSESSIONID);
    
    var_dump($_SESSION); 

    第三行表示使用login服务器的session id,不使用自己的,这样$_SESSION变量里面就有login服务器的session情况了。

    结果。。。。不行。。。。

    bbs服务器还需要一条配置:

    $cookieDomain = '.elf.com';
    
    session_set_cookie_params(0, '/', $cookieDomain);

    这个必须放在session_start()前面!!!,只有这样bbs服务器的session_id($elf_PHPSESSIONID);这一句才会生效,,,,不然bbs服务器还是会以自己的session id来存放文件,而不是用login的session id来存放。

    同理,其他服务器要使用login的session都必须添加这个配置,而且要传入login服务器的session id。

    最后附上代码login.elf.com

    <?php
    
    $cookieDomain = '.elf.com';
    
    session_set_cookie_params(0, '/', $cookieDomain);
    
    session_start();
    
    $shareSid = isset($_COOKIE['elf_PHPSESSIONID']) ? $_COOKIE['elf_PHPSESSIONID'] : '';
    
    if (empty($shareSid)) {
        $shareSid = session_id();
        setcookie('elf_PHPSESSIONID', $shareSid, time()+300 ,'/', $cookieDomain);
    }else{
        session_id($shareSid);
    }
    
    
    $user = isset($_SESSION['user']) ? $_SESSION['user'] : '';
    if (empty($user)) {
        $_SESSION['user'] = 'im login from login.elf.com';
    }
    
    
    var_dump($_SESSION);
    var_dump($_COOKIE);

    bbs.elf.com

    <?php
    
    $cookieDomain = '.elf.com';
    
    session_set_cookie_params(0, '/', $cookieDomain);
    
    session_start();
    
    $shareSid = isset($_COOKIE['elf_PHPSESSIONID']) ? $_COOKIE['elf_PHPSESSIONID'] : '';
    
    if (empty($shareSid)) {
        $shareSid = session_id();
        setcookie('elf_PHPSESSIONID', $shareSid, time()+300 ,'/', $cookieDomain);
    }else{
        session_id($shareSid);
    }
    
    
    $user = isset($_SESSION['user']) ? $_SESSION['user'] : '';
    if (empty($user)) {
        $_SESSION['user'] = 'im login from bbs.elf.com';
    }
    
    
    
    var_dump($_SESSION);
    var_dump($_COOKIE);

    两个域名下的文件,无论从哪个登录,其他域名都能自动成功登录。

    但最好还是有一个login的服务器专门用来登录登出控制session这些,方便管理session,

    不然如果按照上面的例子,如果从login登录,session会存在login服务器的文件里,如果从bbs登录,session会存在bbs服务器的文件里。

    测试的时候记得清cookie!!!

  • 相关阅读:
    [QT_QML]qml假如调试信息 qDebug console.debug
    [QT_FFMPEG]学习问题: 刚开始移植ffmpeg,测试时出现 undefined reference to `avcodec_configuration()'
    [QT_OPENCV] qt下opencv配置以及首个opencv工程
    [QT][SQLITE]学习记录二 日期查询
    [QT][DEMO] QTableWidget 设置某一列禁止编辑
    [QT][SQLITE]学习记录一 querry 查询
    [QT]QPixmap图片缩放和QLabel 的图片自适应效果对比
    [QT]问题记录-QPixmap::scaled 缩放不成功
    利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
    利用javascript实现文本的自动输出
  • 原文地址:https://www.cnblogs.com/alazalazalaz/p/5711935.html
Copyright © 2011-2022 走看看