小叮当的肚兜 2016-11-23 16:02:51 7477次浏览 4条评论 16 4 0

先来碗鸡汤,
处理session跨域几种的方案

前面谈过session相关配置,在开发的时候,常需要跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。
无论是一二级域名,和不同域名下的跨域,无非要达到两点:

  1. 客户端访问同一个sessionId,
  2. 所有域名对应的服务器访问的session的数据的位置必须一致。

1.访问共同的sessionId主要是通过把当前的sessionId写进cookie里面
cookie在不同域名下是不能访问的,我们需要在访问在后台设置用户在登录的时候,把需要共用的登录信息的域名,如果是在1,2级域名下,直接把cookie设置为所属主域名,例如:

setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".a.com"); 

也许你会问:如果是在不同的域名呢?采用P3P技术简单解决,实现原理,在访问网站x.com的时候,y.com程序触发y.com文件的写入sessionid值,sessionid值便可以获取,然后把seesion值存入数据库,取相同的sessionid值便可。这就要求y.com里面的程序文件必需能跨域访问,默认情况下,浏览器是不能跨域设置cookie的,加上p3p头后才行。在对应php文件加上:header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

2.session数据存储位置一致的实现方法
session该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在,而非存储在服务器的内存中,在这里我们得修改为所有域下都能访问的方式。网上介绍了数据库存储,文件形式存储,内存存储, 如果用数据库存储session数据,网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,效率就会明显降低,可以考虑存在内存服务器来实现,下面的session.rar里面介绍的是数据库存session的实例。

在yii2下 处理这中问题,根据网上搜到的教程 终配置成功教程如下:
在frontend的config文件夹中main.php中配置

$host = explode('.', $_SERVER["HTTP_HOST"]);
if (count($host) > 2) {
    define('DOMAIN', $host[1] . '.' . $host[2]);
} else {
    define('DOMAIN', $host[0] . '.' . $host[1]);
}
define('DOMAIN_HOME', 'www.' . DOMAIN);
define('DOMAIN_USER_CENTER', 'man.' . DOMAIN);
define('DOMAIN_API', 'api.' . DOMAIN);
define('DOMAIN_EMAIL', 'mail.' . DOMAIN);
define('DOMAIN_LOGIN', 'login.' . DOMAIN);
define('DOMAIN_IMG', 'img.' . DOMAIN);

然后配置User 和 Session:

'user' => [
    'enableAutoLogin' => true,
    'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN],
],
'session' => [
    'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],
    'timeout' => 3600,
],

这里在配置项的user和session里 我把domain写死了例如:'domain'=>'.baidu.com',这样就不用判断了.

觉得很赞
  • 评论于 2016-11-30 13:26 举报

    sessionid写在cookie里,所以session跨域也就是cookie跨域的问题。

  • 评论于 2016-12-03 11:21 举报

    像这种处理同时登录的情况,可以不可以这样子做呢,登录专门访问一个入口,给入口密码,然后进去读数据,返回状态,根据状态判断是否登录,其实感觉就是做成一个登录接口来用

    1 条回复
    评论于 2016-12-06 11:49 回复

    应该可以,你试试.

  • 评论于 2017-04-07 21:43 举报
    • 时隔多日,虽然又研究了一下,个人觉得这样做不是很合适,因为我觉得二级域名算是一个单独的项目,最好不要与一级域名放在一起,就像yii2高级版自带前后台一样。这样就很方便了。
    • 亲测:一级,二级分开 只需在各自的main.php设置相同的session配置即可
  • 评论于 2021-04-02 18:52 举报

    配置文件里增加前缀即可,你希望同步的增加相同的前缀。
    a.com b.com 用相同的前缀 c.com用另一个

    'session'=>[
    
        'keyPrefix' => 'sessid',
    
    ],
    
您需要登录后才可以评论。登录 | 立即注册