2010-10-06 3 views
5

Im Erstellen einer Webanwendung in Perl mit CGI. Diese Anwendung implementiert die Model-View-Controller-Architektur und das System hat die folgende Struktur im Stammverzeichnis:Wie kann ich Web-Sitzungen mit CGI :: Session in Perl behandeln?

-Modelle -Ansichten -Regler -index.pl

Die Datei index.pl enthält nur die jeweilige Ansichten nach bestimmten Parametern, die an sie gesendet werden (Funktion param() verwendet):

Hier ist mein index.pl:

############################################### 
# INDEX.PL 
############################################### 

#!/usr/bin/perl 

use Switch; 
use CGI qw/:standard/; 
use strict; 
use CGI::Session ('-ip_match'); 

my $session = CGI::Session->load(); 

print header, start_html; 
print "

Menu

"; if(!$session->is_empty){ #links to other files to which only logged users have access; } print '

Login

'; if(defined(param('p'))){ switch(param('p')){ } ##login form in html, which sends param('login') back to index.pl case 'login' { require('views/login/login.pl'); } else{ print "Page not found"; } } if(defined(param('login'))){ ##if param is defined we execute login2.pl require ('views/login/login2.pl'); }

Wie Sie können sehen, ob der Link Anmeldung das Protokoll in Form zeigt zugegriffen wird, dann im Protokoll in Form nach der E-Mail und Passwort der login2.pl Datei laden sollen, einreichen:

login2.pl

############################################### 
LOGIN2.PL 
############################################### 
#!/usr/bin/perl 
    use CGI qw/:standard/; 
    use lib qw(../../); 
    use controllers::UserController; 
    use CGI::Session ('-ip_match'); 

    my $session; 

    my $mail = param('mail'); 
    my $password = param('password'); 

    my $userc = new UserController(); 
    my $user = $userc->findOneByMail($mail); 


    if($mail ne '') 
    { 
     if($mail eq $user->getEmail() and $password eq $user->getPassword()) 
     { 
      $session = new CGI::Session(); 
      $session->header(-location=>'index.exe'); 
     } 
     else 
     { 
      print header(-type=>"text/html",-location=>"index.exe?p=login"); 
     } 
    } 
    elsif(param('action') eq 'logout') 
    { 
     $session = CGI::Session->load() or die CGI::Session->errstr; 
     $session->delete(); 
     print $session->header(-location=>'index.exe'); 
    }

Die Datei login2.pl wird ordnungsgemäß ausgeführt. Sie sollte eine neue Sitzung erstellen, wenn E-Mail und Kennwort korrekt sind. Ich weiß jedoch nicht, ob die Variable $ session korrekt an index.pl gesendet wird, weil der Index immer nur die Links anzeigt, die keine aktive Sitzung benötigen. Ein anderes Problem, das ich habe, ist, dass ich eine Sitzung nicht löschen kann. Ich habe versucht, eine Variable $ Sitzung in der index.pl Datei zu erstellen, nur um zu sehen, ob die Bedingung funktioniert, und dann habe ich es angeblich mit den folgenden Befehlen gelöscht: $ session-> delete(); $ session-> flush(); aber die Sitzung scheint weiterhin zu existieren.

Antwort

5

Warum schaust du nicht in catalyst? Es ist ein MVC-Web-Framework für Perl. Es macht all die langweilige Model-View-Controller-Kopplung für Sie. Es hat auch viele Plugins, unter denen ein Session plugin

Gr, ldx