一个奇怪cookie问题的解决

Strongwillow 1 年之前

问题这样:
自己建立了一个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。

学习会一招

如果使用 curl 应该也是可以的:

 
$ curl -I http://kohana.cn


HTTP/1.1 200 OK
Date: Mon, 16 Aug 2010 15:41:17 GMT
Server: Apache
X-Powered-By: PHP/5.2.14
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: session=hl7fsjnl4um5akjo61mnj613h3; path=/
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

我用的是firefox 的 live http headers
可以看发送和接受双向header

发表讨论

在回复之前你需要先进行登录
记住我的登录状态 (忘记密码)