2012-02-17 178 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