• 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!!!

  • 相关阅读:
    查询session内容
    7个月工作总结
    clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】
    javascript实现jsp页面的打印预览
    Ext:添加进度条
    js实现非模态窗口增加数据后刷新父窗口数据
    websphere:rs.getDate()无法使用的解决方法
    POI实现excel各种验证和导入的思路总结
    Tomcat迁移到WebsphereURL获取中文参数乱码问题
    JS函数参数
  • 原文地址:https://www.cnblogs.com/alazalazalaz/p/5711935.html
走看看 - 开发者的网上家园