2012-06-12 77 views
3

我需要在用戶登錄時存儲登錄會話,並在用戶註銷系統或會話超時時刪除登錄會話。我使用Perl編碼。我知道我可以在Perl中使用CGI :: Session模塊,但是如何確保會話是由1個CGI腳本創建的,並被另一個CGI腳本移除。然後,系統的所有其他頁面都必須檢查會話是否存在,然後才能顯示其內容。在2個CGI腳本中登錄和註銷會話

當前,我使用以下代碼在用戶成功登錄時創建新會話。

my $session = CGI::Session->new(); 
my $CGISESSID = $session->id(); 

但是,如何在另一個cgi腳本中將用戶從會話中註銷?我懷疑我可以只使用以下內容,因爲$ session沒有在其他cgi腳本中定義

$session->delete(); 
$session->flush(); 

任何想法?

回答

2

CGI ::默認情況下,會話獨立於腳本。所以你應該能夠做到這一點。

只要不忘記以某種方式將會話ID保留在客戶端上。它可以用cookie來完成,例如參見會話header()。 ID和會話對象將自動檢索(如果保存正確)。

CGI::Session new()

如果調用時沒有任何參數,$ DSN默認的驅動程序:文件;串行:默認; ID:MD5

CGI::Session::Driver::file

您可以將它們配置爲使用您喜歡的商店和設置。


基本例如 CGI腳本使用會話:

#!/usr/bin/perl 
use strict; 
use warnings; 

use CGI; 
use CGI::Carp qw(fatalsToBrowser); # show errors in browser 
use CGI::Session; 


# new query object 
my $q = CGI->new(); 

# new session object, will get session ID from the query object 
# will restore any existing session with the session ID in the query object 
my $s = CGI::Session->new($q); 


# print the HTTP header and set the session ID cookie 
print $s->header(); 


# print some info 

print "<pre>\n"; 

print "Hello!\n\n"; 
printf "Your session ID is: %s\n", $s->id; 
printf "This sessin is: %s\n", $s->is_new ? 'NEW': 'old'; 
printf "Stored session 'test' value: '%s'\n", $q->escapeHTML($s->param('test')); 
printf "CGI Params: %s\n", join ', ', $q->param; 


# handle the form submit 

if(defined $q->param('save')){ 
    # save param value in the session 
    $s->param('test', $q->param('test')); 
    printf "Set session value: '%s'\n", $q->escapeHTML($s->param('test')); 
} 
elsif(defined $q->param('delete')){ 
    # delete session 
    $s->delete; 
    print "Session will be deleted.\n"; 
} 

print "\n</pre>\n"; 


# simple HTML form 

printf <<'_HTML_', $q->escapeHTML($s->param('test')); 
<hr/> 
<form> 
Session value "test": <input type="text" value="%s" name="test"/> 
<button type="submit" name="save">Save Value</button> 
<button type="submit" name="delete">Delete session</button> 
</form> 
_HTML_ 

# eof (linebreak needed after _HTML_) 
+0

我真的不明白你的意思。你能進一步解釋我可以如何使用header()嗎? – Sakura

+0

@Sakura,在你的CGI腳本中,你可以使用'print $ session-> header();'來代替HTTP頭。這會將會話ID保存爲客戶端上的cookie。 – Qtax

+0

對不起。我還是不太明白。這是如何幫助我將會話ID傳遞給cgi腳本註銷的? – Sakura