2013-06-25 17 views
0

我看過像我這樣的各種問題,但沒有提供正確的答案。 我有一個PHP腳本:PHP - 會話在瀏覽器重啓後設置,但PHP的行爲不是

session_start(); 
setcookie(session_name('DSWLogin'),session_id(),time()+2*7*24*60*60, '/'); 

//This will only be set once (when the user logs in) 
$_SESSION['test'] = 'Yup, I am working'; 

if (isset($_SESSION['test'])){ 
echo 'Session is set and ready!'; 
} else { 
echo 'No session was set...'; 
} 

,所有瀏覽器重新啓動後,工作正常除了,我的PHP腳本忽略了會議。

當我的瀏覽器還沒有重新啓動,它會echo 'Session is set and ready!';就好。 而當我查看我的cookie選項卡時,確實表示一個名爲DSWLogin的cookie已被設置爲具有一定的值。

當我重新啓動我的瀏覽器,我的cookie的選項卡還是說一個cookie,命名DSWLogin已設置與它在重啓之前有同樣的價值,所以它仍然存在! 但我的PHP腳本顯然忽略的,而輸出'No session was set...' ...

由於提前,

以賽亞書訴Hunen

+2

會話在用戶關閉瀏覽器時結束... – Don

+0

你需要逃避'是',我正在工作' - 或者使用雙引號 – Farkie

+0

@Blaine,這並不完全正確。 –

回答

0

僅僅因爲你在一些餅乾設置您的session_id並不意味着它是會話cookie。大多數瀏覽器都會在瀏覽器關閉時清除會話cookie。這就是你所看到的。查看瀏覽器中的cookie,當會話有效時設置cookie,並將其與瀏覽器重新啓動後仍然存在的cookies進行比較。您會注意到您的真實會話cookie已丟失。

2

你所要做的並不是真正實現這一目標的正確方法。會話分爲兩部分,一個會話ID默認設置爲在會話結束時過期(通常是瀏覽器關閉),另一個是服務器端存儲機制,在收到最後一次請求後的一段時間後會自動清除。

你想要做的是將會話延長到兩週。雖然您可以更改Cookie設置並增加會話垃圾回收的超時時間,但這樣做並不十分可靠。

相反,您希望查看使用存儲在Cookie中的一次性密鑰作爲備用登錄路徑。這個cookie可以像正常登錄一樣重新創建會話。有一些細節需要考慮,以保持安全,但它會做你正在嘗試實現的。

+0

所以,你基本上說應該使用cookie來重新啓動瀏覽器後重新創建會話。那麼Cookie不會存儲用戶的密碼嗎? – Isaiah

+0

不,它會存儲一次使用隨機生成的密鑰。該密鑰將存儲在引用用戶的數據庫中。一旦使用,舊密鑰將被銷燬並創建新密鑰。 – datasage

+0

我想這會工作,但最終,它只是變成我的瀏覽器,谷歌Chrome – Isaiah

0

引述manual

會話名稱重置爲在請求啓動時存儲在session.name 的默認值。因此,您需要爲每個請求調用session_name() (並且在session_start()或session_register()調用 )之前調用

另外,如果您想更改會話cookie的使用期限,請使用session_set_cookie_params而不是強制您自己的cookie。

另外閱讀關於會話垃圾收集和configuration,更改cookie的生命週期可能不夠。

+0

是的,我試過,但沒有解決:http://stackoverflow.com/questions/17301114/php-會話設置cookie的PARAMS率壽命犯規工作 – Isaiah

相關問題