ThinkPHP中的跨域名共享session

本文介绍了一种在不同域名间共享Session的方法,通过在主站点执行JS脚本访问辅助站点接口,传递并同步PHPSESSID,实现了跨域登录。适用于同一服务器下使用默认session文件夹的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大笑经过一段时间的研究,终于取得突破

两个网站:

think.local

think2.local

主要原理是:

1、通过在think.local执行js脚本,访问think2.local的接口,将cookie的PHPSESSID传递过去

2、修改think2.local的cookie中的PHPSESSID与think.local一致,从而在think2.local中可以与think.local访问同一个session

3、补充:在同一个服务器中,而且两个网站使用的session文件夹都是php默认

主要代码:

think.local部分:

//测试同步登录
    public function test(){
        session('uid',111);
        $session_id=session_id();
        //同步测试
        $gotourl='<script type="text/javascript" src="http://www.think2.local/api/SynLogin/index/token/thinkphp/session_id/'.$session_id.'"></script>';
        //echo htmlspecialchars($gotourl);exit;
        echo $gotourl;
        echo 'ok';exit;
    }
think2.local部分

//同步登录页
    public function Index(){
        $token=I('get.token');
        if($token!='thinkphp'){
            echo 'wrong';exit;
        }else{
            //同步登录操作
            $session_id=I('get.session_id');
            //$session_id='mh23hdn3h34j2efpno1k95bhm6';
            cookie('PHPSESSID',$session_id);
        }
    }

在think2.local的任意操作中 dump(session());即可获取与think.local一致的session值,从而实现共享session。

PS:可以做跨域名登录了,如果是不同服务器,可以考虑将session信息存入数据库/Redis/Memcached等.

<think>好的,我需要帮助用户了解ThinkPHP 5中Session的使用方法和配置。首先,我得回顾用户提供的引用内容,确保信息准确。用户提到了四个引用,涉及Session的前缀设置、赋值方法、存储到MySQL以及过期时间配置的问题。 首先,我应该整理Session的基本配置。根据引用1和4,配置文件中设置前缀、存储路径和过期时间很重要。特别是引用4提到过期时间不生效的问题,需要说明正确配置的方式,比如将path改为项目内的路径,并设置expire参数。 接下来是使用方法,引用2展示了如何在不同作用赋值Session,比如使用session('name', 'value', 'prefix')。需要详细说明赋值、获取、删除和清空Session的方法,确保用户能按步骤操作。 然后,存储到MySQL的部分参考引用3。这部分需要指导用户创建数据库表,修改配置中的type为数据库,并配置相关参数。同时,提醒用户注意数据表的结构和字段,确保Session能正确存储。 用户可能遇到的常见问题,比如过期时间不生效,引用4指出路径配置的问题,需要强调将path设置为项目内的目录,如TEMP_PATH,并检查过期时间参数是否正确。 最后,生成相关问题,帮助用户进一步了解优化和应用场景。例如,如何解决共享Session,或者如何选择不同的存储驱动。 需要确保回答结构清晰,分点说明配置步骤和使用方法,结合代码示例,并引用相关的引用来源。同时,语言要简洁明了,符合中文习惯,避免使用复杂术语,让用户容易理解。</think>### ThinkPHP 5 Session 使用方法及配置详解 #### 一、基础配置 1. **配置文件位置** 在`config/session.php`中设置全局参数,包含以下核心配置项: ```php 'session' => [ 'prefix' => 'think_', // Session前缀,用于避免多应用冲突[^1][^2] 'type' => '', // 存储驱动(支持file/database/memcached等) 'auto_start' => true, // 自动开启Session 'path' => TEMP_PATH, // 存储路径(需改为项目内目录以控制过期时间)[^4] 'expire' => 3600*24*30, // 过期时间(单位:秒,需与path配合生效) ]; ``` 2. **存储驱动选择** - 默认使用文件存储(`type`留空) - 若需存储到数据库,需配置`type' => 'database'`并指定表名(详见第三部分)[^3] --- #### 二、基础操作方法 1. **赋值Session** ```php // 默认作用 session('user_id', 1001); // 指定前缀作用(如'test'作用session('name', 'thinkphp', 'test'); ``` 2. **获取Session** ```php $userId = session('user_id'); // 获取默认作用值 $name = session('test.name'); // 获取特定前缀作用值 ``` 3. **删除Session** ```php session('user_id', null); // 删除单个值 session('test.name', null); // 删除指定前缀的值 ``` 4. **清空Session** ```php session(null); // 清空所有作用Session session(null, 'test'); // 清空指定前缀的Session ``` --- #### 三、数据库存储配置(以MySQL为例) 1. **创建数据表** 执行以下SQL创建专用Session表: ```sql CREATE TABLE `session` ( `session_id` varchar(255) NOT NULL, `session_expire` int(11) NOT NULL, `session_data` blob, PRIMARY KEY (`session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 2. **修改配置文件** 在`config/session.php`中增加数据库配置: ```php 'type' => 'database', 'table' => 'session', // 表名 'database' => 'db_identifier' // 数据库配置标识(默认使用默认数据库) ``` --- #### 四、常见问题解决 1. **过期时间不生效** - 将`path`改为项目内路径(如`TEMP_PATH`) - 确保`expire`参数单位为秒且未被其他配置覆盖 2. **应用冲突** - 通过设置不同`prefix`值隔离Session(如后台用`admin_`,前端用`web_`)[^1] 3. **性能优化** - 高频访问场景建议使用`redis`或`memcached`驱动 - 文件存储时定期清理`runtime/temp`目录 --- §§ 相关问题 §§ 1. 如何实现ThinkPHP 5的Session共享? 2. Session存储到Redis需要哪些额外配置? 3. 为什么Session在AJAX请求中会失效? 4. 如何验证Session加密机制的安全性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值