|
项目过程中遇到了两个涉及cookie的问题. CI版本 2.1出现问题的前提:PHP复制代码 $config['cookie_prefix'] = "xpf"; // 设置cookie前缀, 防止意外冲突 复制代码
第一个问题. 程序代码:
PHP复制代码 $this->input->set_cookie('uid', 20);
echo 'user id is: '.$this->input->cookie('uid');
// 理论应该输出 user id is: 20
// 但结果却是 user id is: 复制代码
无法取回正确取回 uid. 翻源代码, 发现在 Input 源码中, set_cookie 会自动加上设定的前缀, 但在读取的时候不会自动添加前缀, 这样就导致了设置cookie时存储的是 xpfuid, 但读取的时候是 uid, 这就是为什么不能读取的问题了.
OK, 把这个问题修复. 但同时引出第二个问题
第二个问题. Session
问题前提是, 设置了 cookie 前缀, 并且上一个问题得到修复
还是看代码:
session 配置
PHP复制代码
[align=left]$config['sess_cookie_name'] = 'sec';[/align][align=left] 复制代码
a.php
PHP复制代码 $this->session->set_userdata('uid', 20); 复制代码
b.php
PHP复制代码 echo 'read uid from session: ' . $this->session->userdata('uid');
// 输出: read uid from session:
// 同样无法获取 uid
复制代码
还是翻源代码, 发现 Session.php 里读取session的时候采用的是CI标准输入接口 $this->input->cookie , 但存储的时候却直接使用 setcookie 函数, 输入输出接口不一至.
同时, session 在初始化时, 对session的cookie名进行了处理, 自己添加了前缀, 这样导致写入的时候是 xpfsec, 但读取的时候变成了 xpfxpfsec (修正第一个问题带来的新问题).
OK, 找到问题开始修改. 先把初始化时添加前缀的动作去掉, 这步已经在 input->cookie 里实现了; 接着找到 session->_set_cookie 方法和 session->sess_destroy 方法, 把这两函数里的 setcookie 函数用CI标准输入输出接口替换, 注意参数顺序.
以上问题, 如果不设置前缀则不会有问题. 貌似这个问题一直存在, 以前也有出现CI的cookie不能读取情况, 后来直接用函数规避了这个问题. 这次发现session也不对了, 只能翻源码来修正了.
|
评分
-
查看全部评分
|