我想创建一个不需要cookie但仍有Sessions的应用程序。因此,我创建了SessionID并将其带入URL中。我现在的问题是HTML帮助程序无法识别这一点,并且输出的所有链接都没有会话ID。
是否必须告诉CakePHP这样做或者没有任何机制吗? (在每个链接中获取会话ID)
答案 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。