【发布时间】:2011-04-10 03:47:30
【问题描述】:
我想制作一个不需要 cookie 但仍有会话的应用程序。因此,我创建了 SessionID 并将其放入 URL 中。我现在的问题是 HTML 帮助程序无法识别这一点,并且输出的所有链接都没有会话 ID。
CakePHP 是否必须被告知这样做,还是没有任何机制可以做到这一点? (在每个链接中获取会话 ID)
【问题讨论】:
标签: php session cakephp cookies
我想制作一个不需要 cookie 但仍有会话的应用程序。因此,我创建了 SessionID 并将其放入 URL 中。我现在的问题是 HTML 帮助程序无法识别这一点,并且输出的所有链接都没有会话 ID。
CakePHP 是否必须被告知这样做,还是没有任何机制可以做到这一点? (在每个链接中获取会话 ID)
【问题讨论】:
标签: php session cakephp cookies
我刚刚在 cakephp 中做了一个 url session 实现,我将 cakephp 设置为使用 trans_sid 而不是 cookies:
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 类中重定向和闪烁
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);
}
【讨论】:
这是一个“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。
【讨论】: