2013-09-25 66 views
3

即使瀏覽器已關閉,我也希望用戶不必登錄。我的cookies將在一個月後過期。Perl CGI永久性Cookies

當成功地

$session = CGI::Session->new (undef, undef, {Directory=>'tmp/'}) 
             or die CGI::Session->errstr; 
       $session->param('username', $username); 
       $session->expire('+1M');     
       $cookie = $cgi->cookie(-name=>$session->name, -value=>$session->id); 
       print $cgi->header(-cookie=>$cookie); 

用戶登錄然後它們被重定向到他們,只要他們不要關閉瀏覽器訪問另一個頁面。這是第二頁中的代碼:

my $cookie = $cgi->cookie('CGISESSID'); 
if ($cookie){ 
     print $cgi->header(-cookie => $cookie); 
else{ 
     //ask them to relog in 
} 

我可以看到在tmp /中創建的會話。如何在瀏覽器關閉後加載現有的cookie。我如何知道基於用戶/瀏覽器加載哪個會話?

回答

3

只要你在你的cookies上設置了一個未來的截止日期,即使在用戶重新啓動瀏覽器後(只要它們在該日期之前重新啓動),它們也應該保留。要加載的cookie,你在做什麼:

my $cookie = $cgi->cookie('CGISESSID'); 

要嘗試使用cookie來加載現有會話可以簡單的CGI對象傳遞給new方法CGI ::會議:

my $session = new CGI::Session(undef, $cgi, {Directory=>"/tmp"}); 

這將嘗試使用通過CGI請求傳入的cookie來初始化現有會話;如果不存在,它將創建一個新的會話。請注意,這裏假定cookie名稱是CGISESSID。要使用其他名稱,請運行:

CGI::Session->name("MY_SID"); 
# or 
$session->name("MY_SID"); 

$session = new CGI::Session(undef, $cgi, {Directory=>'/tmp'}); 

如果您還沒有準備好,我會建議通過CGI::Session tutorial閱讀。


編輯:會議定在一個月

$session->expire('+1M'); 

到期,但該cookie沒有。如果您沒有在cookie上設置過期時間,瀏覽器會將其存儲在內存中,而不是存儲在磁盤上;只要關閉瀏覽器,cookie就會消失。要設置Cookie過期,請執行如下操作:

+0

謝謝。我已閱讀文檔,這就是爲什麼我不確定爲什麼我的$ cookie = $ cgi-> cookie('CGISESSID');沒有返回任何東西?我正在第二個文件中創建一個新的cgi對象,也許這就是爲什麼? – Jabda

+1

@Jabda你是否檢查過你的瀏覽器實際上收到了cookie,並且它有正確的會話ID?在Firefox中,您可以通過編輯 - >首選項 - >隱私 - >刪除單個Cookie來完成此操作。您會看到所有存儲的Cookie列表,按站點排列。還有一個搜索功能。 – ThisSuitIsBlackNot

+0

是的,我只在關閉瀏覽器之前纔看到cookie。當我重新打開瀏覽器並返回到頁面時,瀏覽器中沒有cookie(它們位於/ tmp中) – Jabda