onenature 发表于 2012-5-1 12:01:27

Cookie 和 Session 取回问题

项目过程中遇到了两个涉及cookie的问题. CI版本 2.1出现问题的前提:$config['cookie_prefix']        = "xpf";// 设置cookie前缀, 防止意外冲突

第一个问题. 程序代码:
$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 配置

$config['sess_cookie_name']        = 'sec';
a.php
$this->session->set_userdata('uid', 20);
b.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也不对了, 只能翻源码来修正了.


太尉天上飞 发表于 2012-5-1 13:18:56

本帖最后由 太尉天上飞 于 2012-5-1 14:02 编辑

建议使用cookie_helper.php中的函数,:lol很多不是又是不严谨的地方

onenature 发表于 2012-5-2 00:01:02

太尉天上飞 发表于 2012-5-1 13:18 static/image/common/back.gif
建议使用cookie_helper.php中的函数,很多不是又是不严谨的地方

嗯, 倒是个解决方案. 但做为一个框架来说, 还是能统一的比较好.
你这个倒是提醒了我还有个地方要修改 {:1_1:}:P

太尉天上飞 发表于 2012-5-2 11:46:49

onenature 发表于 2012-5-2 00:01 static/image/common/back.gif
嗯, 倒是个解决方案. 但做为一个框架来说, 还是能统一的比较好.
你这个倒是提醒了我还有个地方要修改 {: ...

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);
                }
        }
       
}

Déjà_vu 发表于 2012-8-8 14:48:30

受教了

qi751215210 发表于 2012-12-20 14:35:15

嗯 。不错。。。

qingxin 发表于 2012-12-25 17:36:02

mark,没设过cookie前缀,回去试一下,最近打算把多站点集成到一个项目里
页: [1]
查看完整版本: Cookie 和 Session 取回问题