2012-02-17 239 views
1

我的控制器的许多功能看起来像这样。当一个会话用完并且这样的函数被调用时,对CI采取的最佳措施是什么?处理过期的会话

$this->foo_model->create_bar($this->session->userdata('userid'), $bookId); 
+0

*我的控制器有很多功能... *立即表明您没有遵循DRY(不重复自己)范例。你应该能够在一个地方有这个逻辑。考虑使用控制器继承,以便母亲控制器在会话处理之后寻找并且您的个人控制器不必。参见[此帖](http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-base-Classes-Keeping-it-DRY) – 2012-02-17 06:48:06

回答

3

我不完全得到你的问题,也许,但是当你调用$this->session->userdata('something')一个过期的会话将简单的返回FALSE

所以,最好的方法是检查变量是否不是假?正如你会做任何其他变量可能不是你想要的值:

if($this->session->userdata('userid')){} 
//or check it into the model's method, wherever you prefer 

在哪里以及何时做,在很大程度上取决于你的设计。如果您始终需要执行相同的检查,则可能需要将其作为库或模型的函数,以便您只需编写一次代码并调用该方法即可。如果你需要在其他任何东西之前完成它,你可能会考虑将它放在构造函数中,或者像@Jordan Arsenault建议的那样,创建一个父级MY_Controller来执行检查,并且所有常规控制器都会对其进行扩展。真的,这取决于你的架构,你没有提供足够的信息来回答这个问题。

我可以说的是让你的方法错tolerants,不断将你的代码的其余部分之前检查正确的值(如果在会话过期伤了你的工作流程)

0

您可以使用Cookie来恢复会话过期。例如,当他们登录到你的应用程序,你可以为用户创建一个令牌。这个令牌有你的应用程序知道全球然后保存包含token.each时间会话过期要求客户在用户机器上的cookie相关的用户ID然后查看该cookie是否可用,然后使用其用户名重新创建会话。如果没有令牌可用,则将用户重定向到一个页面,告诉他发生了什么并要求他再次登录。 当用户注销时,删除令牌和cookie

+0

啊,但是如果cookie不存在上面的代码可能会产生错误,所以我不认为这是解决问题的办法。 – Mischa 2012-02-17 07:25:22

+0

正如我所说如果没有可用的cookie或客户端没有启用cookie,您应该将用户重定向到一个页面,告诉他发生了什么并要求他再次登录。 – Beatles1692 2012-02-17 08:07:36

+0

你说得对,对不起。我评论的原因是,我认为坚持一个会话在cookie中是相关的,但并不回答这个问题。 – Mischa 2012-02-17 08:16:04