1

我正在使用数据库进行会话处理。对于使用 RequestHandler 的一些 web 服务调用,我想停止为这些控制器的某些特定操作创建自动会话

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

澄清

在每个 web 服务调用上,它都会在数据库中创建一个新的会话行。但我没有在 action.ie 中使用任何会话功能。即如果有人调用 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);     
}

大批
(
    [饼干] =>
    [认证] => 数组
        (
            [登录操作] => 数组
                (
                    [控制器] => 资源
                    [动作] => 登录
                )

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

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

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

            )

    )

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

[RequestHandler] => 

)

4

1 回答 1

3

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

因此,要么尝试$this->Auth->allow()阻止 cake 检查您的 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 回调中读取会话(在过滤器/渲染之前等)。

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

我还建议您将控制器操作分为真正的 API 操作和非 API 操作。不要把这两个混在一起!这避免了您似乎需要的基于操作的分离。只要有一个网络服务控制器(无会话)和一个后端控制器(用户/会话)等。他们仍然可以共享/使用相同的模型。

于 2013-07-09T14:42:00.190 回答