用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6120|回复: 6
收起左侧

[会话/Cookie] Cookie 和 Session 取回问题

[复制链接]
发表于 2012-5-1 12:01:27 | 显示全部楼层 |阅读模式
项目过程中遇到了两个涉及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也不对了, 只能翻源码来修正了.


评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2012-5-1 13:18:56 | 显示全部楼层
本帖最后由 太尉天上飞 于 2012-5-1 14:02 编辑

建议使用cookie_helper.php中的函数,很多不是又是不严谨的地方
 楼主| 发表于 2012-5-2 00:01:02 | 显示全部楼层
太尉天上飞 发表于 2012-5-1 13:18
建议使用cookie_helper.php中的函数,很多不是又是不严谨的地方

嗯, 倒是个解决方案. 但做为一个框架来说, 还是能统一的比较好.
你这个倒是提醒了我还有个地方要修改
发表于 2012-5-2 11:46:49 | 显示全部楼层
onenature 发表于 2012-5-2 00:01
嗯, 倒是个解决方案. 但做为一个框架来说, 还是能统一的比较好.
你这个倒是提醒了我还有个地方要修改 {: ...

class S_Input extends CI_Input {
       
        /*
         * 修复这个cookie的bug,当config.php中提供$config['cookie_prefix']时
         */
        function cookie($index = '', $xss_clean = FALSE)
        {
                if (isset($_COOKIE[$index]))
                {
                        return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
                }
                else
                {
                        return $this->_fetch_from_array($_COOKIE, config_item('cookie_prefix').$index, $xss_clean);
                }
        }
       
}
发表于 2012-8-8 14:48:30 | 显示全部楼层
受教了
发表于 2012-12-20 14:35:15 | 显示全部楼层
嗯 。不错。。。
发表于 2012-12-25 17:36:02 | 显示全部楼层
mark,没设过cookie前缀,回去试一下,最近打算把多站点集成到一个项目里

本版积分规则