2010-12-09 5 views
1

Ich schreibe eine Webanwendung, die Modul CGI::Session ver 4.35 verwenden muss. Nach dem Empfang Anforderung vom Client mit einem SESSIONID StringPerl, CGI :: Sitzung funktioniert nicht richtig

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

es versucht, die Sitzung neu zu erstellen, indem Sie den $ sid als Argument übergibt

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

Wenn es eine Sitzung mit diesem sid erstellt wurde, $session->id und $sid sind angenommen, um das gleiche zu sein, aber die Wahrheit ist, es ist NICHT.

Dies ist die Aussage, wo ich eine völlig neue Sitzung erstellen

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

Was ist hier falsch gelaufen? Wie soll ich das Modul CGI :: Session richtig benutzen?

Antwort

0

Also, ich bin nicht klar, warum Sie die Sitzung zweimal erstellen? Sie möchten zunächst versuchen, die sid abzurufen, und dann die Sitzung mit ihr erstellen, unabhängig davon, ob sie existiert oder nicht. Wenn es nicht existiert, setze den Cookie. Es ist schon eine Weile, aber ich zog diese aus einem alten Stück Code ...

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

Es war nicht so schlau wie ich die Session-ID zweimal erstellen.Bei der zweiten Anfrage, obwohl die Seite korrekte Sitzungs-ID erhielt, wurde die Anweisung 'my $ session = new CGI :: Session (" id: md5 ", $ sid, {Verzeichnis => $ SESSION_DIR})' 'weiterhin erstellt unterschiedliche Sitzungs-ID Was könnte passiert sein? – wakandan

5

ich den Betreuer des CGI bin :: Session. Ich empfehle, die Schaffung der Sitzung auf die gleiche Weise in allen Fällen wie folgt aus:

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

Dies folgt der empfohlenen Syntax in der Dokumentation für neue(). Ich empfehle auch sicherzustellen, dass Sie flush() explizit am Ende des Skripts aufrufen. Der Grund dafür ist, mehr hier erklärt:

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

2

gibt es wirklich keine Notwendigkeit für Sie das Session-Cookie, sich zu greifen. Wenn Sie eine CGI-Objektinstanz an CGI :: Session übergeben, wird dies für Sie erledigt. Also, im Grunde kann der obige Code von jfd wie folgt neu geschrieben werden:

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

Und $query->cookie() und if/else blockiert alle redundant sind, da sie bereits in CGI existieren :: Session Logik!

Der obige Code überprüft also, ob der Cookie des Clients CGI::Session->name lautet (standardmäßig CGISESSID). Wenn sie nicht vorhanden ist, sucht sie in der URL oder dem Körper der Anforderung mit dem Namen CGI::Session->name (der ebenfalls standardmäßig CGISESSID lautet) nach Abfrageparametern. Wenn es Session-ID anfordern kann, versucht es, seine Daten in die Sitzung zu laden. Wenn die Sitzungs-ID nicht validiert werden kann (entweder abgelaufen oder gefälscht), ignoriert sie sie und erstellt eine neue leere Sitzung.

Wenn die Sitzungs-ID weder im Cookie noch in den URL-Parametern gefunden werden kann, wird eine neue Sitzung erstellt.

Die meisten Beispiele der Sitzungsverwaltung Ich sehe da draußen versuchen, die Sitzungslogik im Code während der Verwendung von CGI :: Session neu zu erfinden. Ich bin nur hier, um dir zu sagen, dass der ganze Code komplett redundant ist !!!

Viel Spaß mit CGI :: Session!