Perl - 重定向和设置cookie时重定向循环

时间:2012-05-09 15:20:09

标签: perl redirect cookies cgi

我是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 {...}

2 个答案:

答案 0 :(得分:4)

此处有拼写错误("index.cgi"后缺少逗号):

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

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

答案 1 :(得分:1)

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

如果您没有启用use strict,则可能会意外地执行您想要的操作。

Perl没有布尔基元类型,因此Perl可能会将true解释为字符串'true'。而且你可能也会在check_credentials函数中犯同样的错误,所以这两个错误会相互抵消。

“Perlish”方法越多,check_credentials就会根据需要返回true或false值(可能是1undef),而if语句则不是检查具体值。

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