Yii2下session跨域名共存的解决方案


Posted in PHP onFebruary 04, 2017

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

无论是一二级域名,和不同域名下的跨域,无非要达到两点:

  • 客户端访问同一个sessionId,
  • 所有域名对应的服务器访问的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',这样就不用判断了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
判断php数组是否为索引数组的实现方法
Jun 13 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
php获取ip及网址的简单方法(必看)
Apr 01 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 PHP
Laravel Eloquent ORM 多条件查询的例子
Oct 10 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 #PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 #PHP
php基于dom实现的图书xml格式数据示例
Feb 03 #PHP
PHP遍历目录文件的常用方法小结
Feb 03 #PHP
详解yii2实现分库分表的方案与思路
Feb 03 #PHP
php获取客户端IP及URL的方法示例
Feb 03 #PHP
php观察者模式应用场景实例详解
Feb 03 #PHP
You might like
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
php使用session二维数组实例
2014/11/06 PHP
javascript Window及document对象详细整理
2011/01/12 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
js倒计时显示实例
2016/12/11 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
JavaScript常用内置对象用法分析
2019/07/09 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python操作xml文件详细介绍
2014/06/09 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
大学生先进事迹材料
2014/02/16 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
观后感的写法
2015/06/19 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server