2

我是一个 Perl 新手,我遇到了这个问题:

我有一个 _login.cgi 脚本,它管理登录并在凭据正确时重定向到 index.cgi 页面:

if (functions::check_credentials($input{"username"}, $input{"password"}) eq true ){

$session = new CGI::Session("driver:File", undef, {File::Spec->tmpdir});
$session->param("name", "Carcarlo Pravettoni");

$cookie = $page->cookie(CGISESSID => $session->id);
print $page->redirect( -URL => "index.cgi" -cookie=>$cookie);

} else {...}

但是当我使用正确的凭据尝试它时,我得到一个无限重定向循环到 _login.cgi (这个脚本本身)。

相反,如果我不发送带有重定向的 cookie,一切正常:

if (functions::check_credentials($input{"username"}, $input{"password"}) eq true ){

$session = new CGI::Session("driver:File", undef, {File::Spec->tmpdir});
$session->param("name", "Carcarlo Pravettoni");

$cookie = $page->cookie(CGISESSID => $session->id);
print $page->redirect( -URL => "index.cgi");

} else {...}
4

2 回答 2

4

你这里有一个错字(后面缺少逗号"index.cgi"):

print $page->redirect( -URL => "index.cgi" -cookie=>$cookie);

我建议您启用strictwarnings(并且可能diagnostics),并重构代码,直到没有错误/警告。

于 2012-05-09T15:41:35.723 回答
1
if (functions::check_credentials($input{"username"}, $input{"password"}) eq true )

如果你没有use strict打开,那么这可能是不小心做了你想做的事。

Perl 没有 Boolean 原始类型,因此 Perl 可能将其解释true为 string 'true'。而且很可能你在check_credentials函数中也犯了同样的错误,所以这两个错误相互抵消了。

更“Perlish”的方法是适当check_credentials地返回真值或假值(可能1undef),并且if语句不检查特定值。

if (functions::check_credentials($input{"username"}, $input{"password"})) { ... }
于 2012-05-09T16:10:32.267 回答