SESSION和COOKIE是每個面試官必問的知識點,下面爲大家介紹下如何設置一個嚴格30分鐘過期的Session,具體示例如下,感興趣的朋友可以參考下哈,希望對大家有所幫助
SESSION和COOKIE是每個面試官必問的知識點,所以希望同學能深刻學習理解這部分以獲得更好的工作機會
以下內容轉之laruence博客(這是個學習PHP的好地方,詳情點擊http://www.laruence.com/)
我在面試的時候, 經常會問一個問題: “如何設置一個30分鐘過期的Session?”, 大家不要覺得看似簡單, 這裏麪包含的知識挺多, 特別適合考察基本功是否紮實, 誰來回答試試? 呵呵
爲什麼問這個問題呢? 1. 我在Twitter上看到了有人討論這個問題, 2 想起來我經常問這個問題, 所以~~
在這裏, 我來解答下這個題目.
第一種回答
那麼, 最常見的一種回答是: 設置Session的過期時間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下:
1. 首先, 這個PHP是用一定的概率來運行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看 深入理解PHP原理之Session Gc的一個小概率Notice), 這個默認的值分別是1和100, 也就是有1%的機會, PHP會在一個Session啓動時, 運行Session gc. 不能保證到30分鐘的時候一定會過期.
2. 那設置一個大概率的清理機會呢? 還是不妥, 爲什麼? 因爲PHP使用stat Session文件的修改時間來判斷是否過期, 如果增大這個概率一來會降低性能, 二來, PHP使用”一個”文件來保存和一個會話相關的Session變量, 假設我5分鐘前設置了一個a=1的Session變量, 5分鐘後又設置了一個b=2的Seesion變量, 那麼這個Session文件的修改時間爲添加b時刻的時間, 那麼a就不能在30分鐘的時候, 被清理了. 另外還有下面第三個原因.
3. PHP默認的(Linux爲例), 是使用/tmp 作爲Session的默認存儲目錄, 並且手冊中也有如下的描述:
Note: 如果不同的腳本具有不同的 session.gc_maxlifetime 數值但是共享了同一個地方存儲會話數據,則具有最小數值的腳本會清理數據。此情況下,與 session.save_path 一起使用本指令。
也就是說, 如果有倆個應用都沒有指定自己獨立的save_path, 一個設置了過期時間爲2分鐘(假設爲A), 一個設置爲30分鐘(假設爲B), 那麼每次當A的Session gc運行的時候, 就會同時刪除屬於應用B的Session files.
所以, 第一種答案是不”完全嚴格”正確的.
第二種答案
還有一種常見的答案是: 設置Session ID的載體, Cookie的過期時間, 也就是session.cookie_lifetime. 這種回答也是不正確的, 原因如下:
這個過期只是Cookie過期, 換個說法這點就考察Cookie和Session的區別, Session過期是服務器過期, 而Cookie過期是客戶端(瀏覽器)來保證的, 即使你設置了Cookie過期, 這個只能保證標準瀏覽器到期的時候, 不會發送這個Cookie(包含着Session ID), 而如果通過構造請求, 還是可以使用這個Session ID的值.
第三種答案
使用memcache, redis等, okey, 這種答案是一種正確答案. 不過, 很顯然出題者肯定還會接着問你, 如果只是使用PHP呢?
第四種答案
當然, 面試不是爲了難道你, 而是爲了考察思考的周密性. 在這個過程中我會提示出這些陷阱, 所以一般來說, 符合題意的做法是:
1. 設置Cookie過期時間30分鐘, 並設置Session的lifetime也爲30分鐘.
2. 自己爲每一個Session值增加Time stamp.
3. 每次訪問之前, 判斷時間戳.
最後, 有同學問, 爲什麼要設置30分鐘的過期時間: 這個, 首先這是爲了面試, 第二, 實際使用場景的話, 比如30分鐘就過期的優惠劵?
SESSION和COOKIE是每個面試官必問的知識點,所以希望同學能深刻學習理解這部分以獲得更好的工作機會
以下內容轉之laruence博客(這是個學習PHP的好地方,詳情點擊http://www.laruence.com/)
我在面試的時候, 經常會問一個問題: “如何設置一個30分鐘過期的Session?”, 大家不要覺得看似簡單, 這裏麪包含的知識挺多, 特別適合考察基本功是否紮實, 誰來回答試試? 呵呵
爲什麼問這個問題呢? 1. 我在Twitter上看到了有人討論這個問題, 2 想起來我經常問這個問題, 所以~~
在這裏, 我來解答下這個題目.
第一種回答
那麼, 最常見的一種回答是: 設置Session的過期時間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下:
1. 首先, 這個PHP是用一定的概率來運行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看 深入理解PHP原理之Session Gc的一個小概率Notice), 這個默認的值分別是1和100, 也就是有1%的機會, PHP會在一個Session啓動時, 運行Session gc. 不能保證到30分鐘的時候一定會過期.
2. 那設置一個大概率的清理機會呢? 還是不妥, 爲什麼? 因爲PHP使用stat Session文件的修改時間來判斷是否過期, 如果增大這個概率一來會降低性能, 二來, PHP使用”一個”文件來保存和一個會話相關的Session變量, 假設我5分鐘前設置了一個a=1的Session變量, 5分鐘後又設置了一個b=2的Seesion變量, 那麼這個Session文件的修改時間爲添加b時刻的時間, 那麼a就不能在30分鐘的時候, 被清理了. 另外還有下面第三個原因.
3. PHP默認的(Linux爲例), 是使用/tmp 作爲Session的默認存儲目錄, 並且手冊中也有如下的描述:
Note: 如果不同的腳本具有不同的 session.gc_maxlifetime 數值但是共享了同一個地方存儲會話數據,則具有最小數值的腳本會清理數據。此情況下,與 session.save_path 一起使用本指令。
也就是說, 如果有倆個應用都沒有指定自己獨立的save_path, 一個設置了過期時間爲2分鐘(假設爲A), 一個設置爲30分鐘(假設爲B), 那麼每次當A的Session gc運行的時候, 就會同時刪除屬於應用B的Session files.
所以, 第一種答案是不”完全嚴格”正確的.
第二種答案
還有一種常見的答案是: 設置Session ID的載體, Cookie的過期時間, 也就是session.cookie_lifetime. 這種回答也是不正確的, 原因如下:
這個過期只是Cookie過期, 換個說法這點就考察Cookie和Session的區別, Session過期是服務器過期, 而Cookie過期是客戶端(瀏覽器)來保證的, 即使你設置了Cookie過期, 這個只能保證標準瀏覽器到期的時候, 不會發送這個Cookie(包含着Session ID), 而如果通過構造請求, 還是可以使用這個Session ID的值.
第三種答案
使用memcache, redis等, okey, 這種答案是一種正確答案. 不過, 很顯然出題者肯定還會接着問你, 如果只是使用PHP呢?
第四種答案
當然, 面試不是爲了難道你, 而是爲了考察思考的周密性. 在這個過程中我會提示出這些陷阱, 所以一般來說, 符合題意的做法是:
1. 設置Cookie過期時間30分鐘, 並設置Session的lifetime也爲30分鐘.
2. 自己爲每一個Session值增加Time stamp.
3. 每次訪問之前, 判斷時間戳.
最後, 有同學問, 爲什麼要設置30分鐘的過期時間: 這個, 首先這是爲了面試, 第二, 實際使用場景的話, 比如30分鐘就過期的優惠劵?
如何設置一個嚴格30分鐘過期的Session示例介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
xshell評估過期的解決方法
yzllinux
2019-02-23 00:04:22
SQL2008遇到的幾個小問題處理辦法
o缺氧的魚o
2019-02-22 23:22:50
Oracle密碼過期
he2375813
2019-02-22 18:48:16
Oracle密碼過期如何取消密碼180天限制及密碼180天過期,賬號鎖住的問題
mrr
2018-12-13 16:23:17
openssl 檢查證書是否過期
zenge_blog
2018-11-25 02:04:03
做了「負載均衡」就可以隨便加機器了嗎?這三招來幫你!
Zachary_Fan
2019-02-23 00:21:39
ZooKeeper Session分析
微子Lee
2019-02-22 21:56:45
Hibernate Session的delete()方法
644341033
2019-02-22 17:59:21
Application、Session、Cookie、ViewState的特性
jammeswang
2019-02-22 17:22:33
Tomcat基於DeltaManager實現Session Cluster
Marion0728
2019-02-11 13:01:02
Windows Server 2012 之快速添加基於Session的遠程桌面會話
virtualcca
2018-12-31 13:30:27
JavaWeb之Cookie&Session
灰白世界
2018-12-12 13:15:40
SpringSession 請求與響應重寫的實現
glmapper
2018-11-28 13:17:50
如何解決asp.net負載均衡時Session共享的問題
king_819
2018-11-14 02:05:36