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

 

posted on 2016-07-27 17:23  allen__  阅读(954)  评论(0编辑  收藏  举报

导航