问题这样:
自己建立了一个auth的module(注意不是自带的),只有一个init.php文件。作用是每次页面请求时先通过 cookie取得用户的登陆信息。
假设只有一行:
echo Cookie::get('a');
在controller/login.php中
登陆的设置cookie的代码是:
if ( $user_id !== FALSE )
{
$cookie = $email."?".$user_id;
$encrypt = Encrypt::instance();
$cookie = $encrypt->encode($cookie);
Cookie::set(''a', $cookie, 3600*1000);
Response::send();
}
现在的问题是:
登陆成功后,可以看到cookie已经有值了,但是一但访问了别的页面(会自动执行auth模块的init.php),那个a的cookie就不见了。这是为什么呢?
解决:
通过检查http header,看到在login.php返回这样的值:
Set-Cookie: a=1b7c522c0698c123feda605aaa9f026d21ac3402%7E; expires=Sat, 14-Aug-2010 08:10:47 GMT; path=/memoor/; httponly
Set-Cookie: a=4478a6529d7c6d8638d971172db2c5c830bcfb86%7Es; expires=Sun, 26-Sep-2010 00:10:47 GMT; path=/memoor/; httponly
Cookie::get如果发现hash错误,会delete掉这个key。这就是第一个set-cookie的原因。
怀疑Cookie::salt函数有问题。
在init.php中,echo Cookie::$salt,返回“kooky”
在controller_server中,echo Cookie::$salt,返回“your secret is safe with me”
在bootstrap.php找到 “Kohana::modules(array(” 这一段后面有
Cookie::$salt = "your secret is safe with me",把它放到Kohana::modules(array 上面或者去掉,问题解决。
通过此例,大家可以看到kohana的运行顺序,在处理cookie等问题时,header可有效帮助debug。
发表讨论