我使用CGI在Perl中创建Web应用程序。此应用程序实现模型视图控制器体系结构,并且系统在根目录中具有以下结构:
-models -views -controllers -index.pl
文件index.pl只根据发送给它的某些参数包含相应的视图(使用函数param()):
这是我的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');
}
正如您可以看到访问链接登录是否会显示登录表单,然后在提交电子邮件和密码后的登录表单中,应该加载login2.pl文件:
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');
}
login2.pl文件正确执行,当邮件和密码正确时,它应该创建一个新会话。但是,我不知道变量$ session是否正确发送到index.pl,因为索引始终只显示不需要活动会话的链接。 我遇到的另一个问题是我无法删除会话。我尝试在index.pl文件中创建一个变量$ session,只是为了查看条件是否有效,然后我猜想用以下命令将其删除: $会话而>删除(); $会话而>冲洗(); 但会议似乎仍然存在。
答案 0 :(得分:5)
为什么不调查catalyst? 它是perl的MVC Web框架。 它为您完成所有繁琐的模型 - 视图 - 控制器耦合。 它还有许多插件,其中包括Session plugin
GR, LDX