CakePHP会话不应该在某些控制器操作上启动

时间:2013-07-09 14:29:14

标签: cakephp cakephp-2.0 cakephp-2.1

我正在使用数据库进行会话处理。对于使用RequestHandler的一些webservice调用,我想停止为控制器

的某些特定操作创建自动会话

我的问题: 如何在控制器的某些操作中停止自动会话启动?请注意我在AppController中定义了Auth组件。 有没有办法停止会议?我是否需要在行动中使用$ this-> Session-> destroy()?

澄清

在每个webservice调用上它在数据库中创建一个新的会话行。但是我没有在action.i.e中使用任何会话功能。如果任何人调用10次动作,则会创建10个会话。我觉得它会创建数据库空间和时间开销。

按建议应用新更改

使用此

无法获得正确的结果
 // overwrite constructClasses() for remove session in certain actions
     public function constructClasses() {
         // remove the Session from components again here
         // either globally or for certain actions

         if (in_array($this->action,  array('test1','test2'))) {
            foreach($this->components as $key => $val){
                if($val =='Session'){
                   unset($this->components[$key]);
                }
            }    
         }
         parent::constructClasses();
     }

但是仍然通过API调用在test1 0r test2上创建了新的会话ID

// out put of below code.
function beforeFilter() {
    pr($this->components);     
}

Array
(
    [Cookie] => 
    [Auth] => Array
        (
            [loginAction] => Array
                (
                    [controller] => resources
                    [action] => login
                )

        [loginRedirect] => Array
            (
                [controller] => resources
                [action] => view
            )

        [logoutRedirect] => Array
            (
                [controller] => resources
                [action] => login
            )

        [authenticate] => Array
            (
                ......

            )

    )

[Security] => Array
    (
        [csrfExpires] => +1 hour
    )

[RequestHandler] => 

)

1 个答案:

答案 0 :(得分:2)

关键是不要在这些操作中访问会话。 只要您不访问它,会话就不会自动启动。

因此,请尝试使用$this->Auth->allow()来阻止蛋糕检查您的Auth会话,或者从此控制器中删除Auth组件:

// overwrite constructClasses()
public function constructClasses() {
     // remove the Auth/Session from components again here
     // either globally or for certain actions
     if (in_array($this->action, $myListOfActions)) {
         // ...
     }
     parent::constructClasses();
}

另外请确保您没有从AppController回调中读取会话(beforeFilter / render等)。

无论哪种方式,请确保没有任何东西试图查看会话。 另请注意,最近有一些改进可以防止在2.3中关于Auth AFAIK的不必要的会话查找。如果上述操作失败,您可能想尝试一下。

我还建议您将控制器操作分为实际的API和非API的操作。不要混合那两个! 这避免了您似乎需要的基于动作的分离。 只需要一个webservice控制器(无会话)和后端控制器(用户/会话)等。他们仍然可以共享/使用相同的模型。