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 相关文章推荐
追求程序速度,而不是编程的速度
Apr 23 PHP
PHP 翻页 实例代码
Aug 07 PHP
PHP中文件上传的一个问题
Sep 04 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
详解php的魔术方法__get()和__set()使用介绍
Sep 19 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
tp5.1 框架join方法用法实例分析
May 26 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 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 命名空间实例说明
2011/01/27 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
PHP实现递归的三种方法
2020/07/04 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
js展开闭合效果演示代码
2013/07/24 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
python中定义结构体的方法
2013/03/04 Python
python抓取网页图片示例(python爬虫)
2014/04/27 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
进程的查看和调度分别使用什么命令
2015/03/25 面试题
办公文员的工作岗位职责
2013/11/12 职场文书
运动会致辞稿50字
2014/02/04 职场文书
新教师培训方案
2014/06/08 职场文书
幼儿园标语大全
2014/06/19 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
简短清晨问候语
2015/11/10 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书