我正在使用数据库进行会话处理。对于使用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] =>
)
答案 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控制器(无会话)和后端控制器(用户/会话)等。他们仍然可以共享/使用相同的模型。