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 14:02 编辑
建议使用cookie_helper.php中的函数,:lol很多不是又是不严谨的地方 太尉天上飞 发表于 2012-5-1 13:18 static/image/common/back.gif
建议使用cookie_helper.php中的函数,很多不是又是不严谨的地方
嗯, 倒是个解决方案. 但做为一个框架来说, 还是能统一的比较好.
你这个倒是提醒了我还有个地方要修改 {:1_1:}:P 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);
}
}
} 受教了 嗯 。不错。。。 mark,没设过cookie前缀,回去试一下,最近打算把多站点集成到一个项目里
页:
[1]