没有Cookie的CakePHP会话

时间:2010-09-09 08:49:24

标签: php session cakephp cookies

我想创建一个不需要cookie但仍有Sessions的应用程序。因此,我创建了SessionID并将其带入URL中。我现在的问题是HTML帮助程序无法识别这一点,并且输出的所有链接都没有会话ID。

是否必须告诉CakePHP这样做或者没有任何机制吗? (在每个链接中获取会话ID)

2 个答案:

答案 0 :(得分:4)

我刚刚在cakephp中创建了一个url会话实现,我将cakephp设置为使用trans_sid而不是cookie:

ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);

这可以使用以下方式完成:http://bakery.cakephp.org/articles/admad/2009/09/02/how-to-bend-cakephp-s-session-handling-to-your-needs 并使用beforefilter读取会话ID表单url参数并从中设置会话ID,如果会话ID未设置为url参数,则使用cookie

// Use sid from post
if (!empty($this->params['url']['sid'])) {
    $this->Session->id($this->params['url']['sid']);
}
// Or failover to cookie
else
{
    $this->Session->id($this->Cookie->read('CAKEPHP'));
}

请记住覆盖AppHelper类中的url函数

function url($url = null, $full = false) {
    return parent::url($url, $full)."/?sid=".session_id();
}

并在AppController类中重定向和flash

function redirect($url, $status = null, $exit = true) {
    $url = $url."?sid=".session_id();
    return parent::redirect($url, $status, $exit);
}

function flash($message, $url, $pause = 1, $layout = 'flash') {
    $url = $url."?sid=".session_id();
    return parent::flash($message, $url, $pause, $layout);
}

答案 1 :(得分:3)

这是“CakePHP中仍有PHP的情况”。据我所知,默认的HtmlHelper没有附加任何会话值,因为Cake支持cookie会话。您可以使用标准的PHP工具来改变它。

首先,您需要customize the cookie handling。有关详情,请参阅此处:How to bend CakePHP's session handling to your needs。然后,您需要决定是否使用PHP's trans-sid functionality,或使用SID constant作为转移会话ID的方法。如果是后者,您可能需要创建自定义AppHelper::url方法以自动将其包含在每个链接中。请参阅此处以获取类似问题的解决方案:Adding a prefix to every URL in CakePHP