2010-12-09 49 views
1

我正在編寫一個需要使用模塊CGI::Session版本4.35的Web應用程序。在從客戶端接收請求與SESSIONID串Perl,CGI :: Session無法正常工作

$sid = $cgi->cookie("CGISESSID") || $cgi->param("CGISESSID") || undef; 

它試圖通過將$ SID作爲參數

$session = new CGI::Session($sid) or ($logger->error(CGI::Session->errstr) and die); 

如果有與SID,$session->id創建一個會話重新創建會話, $sid假設是相同的,但事實是它的不是

這是我創建一個完全新的會話

$session = new CGI::Session("id:md5", undef, {Directory=>$SESSION_DIR}) 
    or ($logger->error(CGI::Session->errstr) and die); 

什麼錯在這裏去的聲明?我該如何正確使用模塊CGI :: Session?

回答

0

所以,我不清楚你爲什麼創建會話兩次?你想先嚐試並獲得sid,然後創建會話,無論它是否存在。如果它不存在,請設置cookie。已經有一段時間了,但我從一段舊代碼中提取了這個...

my $sid = $query->cookie('CGISESSID') || undef; 
# grab the session obj, if one already exists otherwise create one 
my $session = new CGI::Session("id:md5", $sid, { Directory => $SESSION_DIR }); 
# If there is no user cookie, or it's non existent, we give them a new one 
if (!$sid or $sid ne $session->id) { 
    my $cookie = $query->cookie(
     -name => 'CGISESSID', 
     -value => $session->id, 
     -expires => EXPIRE_TIME 
    ); 
    $self->header_props(-cookie => $cookie); 
} 
+0

這並不像我創建會話ID兩次那麼聰明。然而,在第二個請求中,雖然頁面收到了正確的會話ID,但是語句`my $ session = new CGI :: Session(「id:md5」,$ sid,{Directory => $ SESSION_DIR});`繼續創建不同的會話ID。發生了什麼事? – wakandan 2010-12-09 02:45:20

5

我是CGI :: Session的維護者。我建議在所有情況下以相同的方式創建會話,如下所示:

$session = CGI::Session->new("id:md5", $cgi, {Directory=>$SESSION_DIR}); 

這遵循new()文檔中的推薦語法。我還建議確保在腳本結尾處明確調用flush()。其原因解釋請見:

http://metacpan.org/pod/CGI::Session#A-Warning-about-Auto-flushing

2

實在是沒有必要爲你自己搶會話cookie。如果你將一個CGI對象實例傳遞給CGI :: Session,它會爲你做。所以,基本上,通過JFD上面的代碼可以重新寫成這樣:

my $session = CGI::Session->new($query); 
$self->header_props(-cookie => $session->cookie); 

而且$query->cookie()if/else塊都是多餘的,因爲他們已經在CGI存在:: Session的邏輯!

因此,上面的代碼檢查客戶端的cookie名爲CGI::Session->name(默認爲CGISESSID)。如果它不存在,則在URL或請求的主體中查找名爲CGI::Session->name(也默認爲CGISESSID)的查詢參數。如果它可以獲得聲明的會話ID,它會嘗試將其數據加載到會話中。如果會話ID無法驗證(無論是過期還是僞造),它會忽略它,並創建一個全新的空會話。

如果無法在cookie中或在URL參數中找到會話ID,它將創建一個新會話。

會議管理的大多數例子我看到那裏試圖在使用CGI :: Session時重新發明代碼中的會話邏輯。我只是在這裏告訴你,所有的代碼是完全多餘的!

享受使用CGI :: Session!