2009-08-25 99 views
11

我使用登錄功能在我的網站與會話。 無論用戶是否註銷,此會話都會在幾分鐘後過期。 現在我想要的是會話應該只會在用戶註銷時過期。如果用戶不註銷他的帳戶,然後2-3天后回來,甚至他應該出現登錄。會話本身永遠不會過期

我有發現了一些例子,他們增加了會話到期的時間,但我希望它只應該在用戶註銷事件時到期,而不管他花費多少時間註銷。

我該怎麼做?

編輯:

session_cache_expire(0); 
session_start(); 

這是寫的方式這樣做呢?

回答

24

經常使用,這種情況下的解決方案是:

  • 有一個不太長的會話持續時間:如果用戶沒有激活它就會過期(這只是它的工作方式 - 如果你有很多用戶,這對你的服務器更好)
  • 當用戶登錄時,你設置一個包含他需要被識別的內容的cookie
  • 如果他回到網站(用cookie,並且沒有活動會話),您可以使用該cookie中包含的信息自動登錄,同時重新創建會話。

這樣:

  • 你沒有數千個會話的「活動」,沒有很好的理由
  • 您保持標準的方式工作會議

你有至少從用戶的角度來看,「永遠不會被堵住」的優勢。

另請注意,對於「正常」會話,當用戶關閉瀏覽器時,包含會話ID的cookie將被刪除 - 因此,無論會話的生命期是多長,他都將被斷開連接。
隨着我提出的解決方案,你是一個誰設置cookie的應該多長時間留在用戶的計算機;-)


這意味着,雖然,當用戶手動註銷手續,你有當然刪除他的會話和cookie,所以他不是立即重新自動登錄。


當然,你必須要小心你在cookie中設置:Cookie是不太安全的,所以不要在它存儲的密碼,例如;-)


事實上,這種做事方式是「記住我」功能經常起作用的方式;除非,在這裏,你的用戶就不必檢查複選框,激活「記住我」 ;-)


如果您還沒有開發這種東西的時候,一個非常快速和骯髒的方法是在所有頁面上使用一些Ajax請求,這隻會在服務器上「ping」一個PHP頁面 - 這會使會話保持活動狀態(但這不是一個很好的做事方式:你仍然有很多會話在服務器上,你會有很多無用的請求......並且只有當用戶沒有關閉他的瀏覽器時它纔會起作用)。

+0

我已經設定的用戶名和一個隨機數,一個cookie串接到它,然後我已經將它存儲到數據庫中了。當一個頁面被調用,然後我檢查系統cookie,並將其與數據庫中的一個匹配,如果兩者匹配,那麼我顯示該人登錄,否則不會。並且當一個人註銷時,我將該cookie設置爲空。 這是正確的方式嗎?這是安全的嗎? – developer 2009-08-26 08:27:09

+0

至少對我來說似乎不錯 - 它永遠不會是「完美的安全性」,因爲任何使用該傢伙的電腦的人都會自動登錄,但這應該足夠了,我想:-) – 2009-08-26 10:38:27

+0

遐我瞭解安全問題。非常感謝馬丁:-) – developer 2009-08-26 12:06:19

0

您在測試時刪除了Cookie嗎?啓用了cookies嗎?你的代碼在某個地方破壞會話嗎?

此外,請參閱我對另一篇文章的回答:Quick question about sessions in PHP,它解釋瞭如何保持登錄狀態。如果您希望用戶永遠保持登錄狀態,請不要執行cronjob/sheduled任務。

2

你無法單獨使用PHP內部會話處理。 PHP將始終在session-cookie中發送會話標識,該標識在用戶關閉瀏覽器時會過期。要實現某種自動登錄,您需要一些附加代碼,在用戶的瀏覽器上設置持久性Cookie,並處理這些Cookie的識別以及Cookie值與相應用戶帳戶之間的映射。

請注意,這會嚴重影響安全問題,因此您必須處理很多事情。請下面就看怎麼可能自動登錄功能,可以工作: