带有CGI::Session的Perl Web登录脚本

带有CGI::Session的Perl Web登录脚本,perl,cgi,Perl,Cgi,差不多两周前,我就有同样的问题了。 我是Perl和Web的新手:/ 我遵循了CGI::Session教程和食谱,代码看起来不错,但是。。。不工作 index.cgi login.cgi 当我尝试登录时,不会发生任何事情,即使我尝试了错误的凭据,它也会在尝试3次后阻止我,但事实并非如此 有人真的能帮我吗?我再也受不了了 如有任何问题,请随时提问:) 编辑: -已更正登录尝试() -负载配置文件不起作用,创建了一个新的,但仍需要改进 -最后一个问题是会话初始化您确定没有收到任何错误吗?您是否检查了w

差不多两周前,我就有同样的问题了。 我是Perl和Web的新手:/

我遵循了CGI::Session教程和食谱,代码看起来不错,但是。。。不工作

index.cgi

login.cgi

当我尝试登录时,不会发生任何事情,即使我尝试了错误的凭据,它也会在尝试3次后阻止我,但事实并非如此

有人真的能帮我吗?我再也受不了了

如有任何问题,请随时提问:)

编辑:

-已更正登录尝试()

-负载配置文件不起作用,创建了一个新的,但仍需要改进


-最后一个问题是会话初始化

您确定没有收到任何错误吗?您是否检查了web服务器错误日志

您使用两个参数(
$session
$cgi
)调用
login\u trunt()
),但在login.cgi中,该子例程的定义如下:

sub login_attempt() {
  ...
}
您(可能是无意中)在该子例程上使用了一个原型,告诉Perl它不接受任何参数。因此,如果你没有得到一个错误,我会感到惊讶,说:

main::login\u尝试的参数太多

从该定义中删除括号

sub login_attempt {
  ...
}
更新:我认为您错过了一个非常重要的步骤。从:

在如上所述创建CGI::Session对象之后,应用程序需要执行一件很小但非常重要的事情。它需要将会话ID作为HTTP cookie放入用户的计算机中。会话将使用此cookie在用户的下一个请求中标识用户,并能够加载他/她以前存储的会话数据

为了确保CGI::Session能够在下一次请求时读取cookie,您需要咨询其name()方法以获取cookie的建议名称:

$cookie = $query->cookie( -name   => $session->name,
                          -value  => $session->id );
print $query->header( -cookie=>$cookie );
默认情况下,
name()
返回CGISESSID。如果您喜欢不同的cookie名称,也可以很容易地更改它,但必须在创建CGI::Session对象之前进行更改:

CGI::Session->name("SID");
$session = CGI::Session->new();
烤饼干不太难,是吗?但使用CGI::Session发送cookie有一种更简单的方法:

print $session->header();
上面将使用CGI::cookie创建cookie,并使用CGI.pm的CGI方法返回正确的http头。CGI::Session的任何参数都将传递给CGI::header()


否则,您将为每个请求创建一个全新的会话。

您确定没有收到任何错误吗?您是否检查了web服务器错误日志

您使用两个参数(
$session
$cgi
)调用
login\u trunt()
),但在login.cgi中,该子例程的定义如下:

sub login_attempt() {
  ...
}
您(可能是无意中)在该子例程上使用了一个原型,告诉Perl它不接受任何参数。因此,如果你没有得到一个错误,我会感到惊讶,说:

main::login\u尝试的参数太多

从该定义中删除括号

sub login_attempt {
  ...
}
更新:我认为您错过了一个非常重要的步骤。从:

在如上所述创建CGI::Session对象之后,应用程序需要执行一件很小但非常重要的事情。它需要将会话ID作为HTTP cookie放入用户的计算机中。会话将使用此cookie在用户的下一个请求中标识用户,并能够加载他/她以前存储的会话数据

为了确保CGI::Session能够在下一次请求时读取cookie,您需要咨询其name()方法以获取cookie的建议名称:

$cookie = $query->cookie( -name   => $session->name,
                          -value  => $session->id );
print $query->header( -cookie=>$cookie );
默认情况下,
name()
返回CGISESSID。如果您喜欢不同的cookie名称,也可以很容易地更改它,但必须在创建CGI::Session对象之前进行更改:

CGI::Session->name("SID");
$session = CGI::Session->new();
烤饼干不太难,是吗?但使用CGI::Session发送cookie有一种更简单的方法:

print $session->header();
上面将使用CGI::cookie创建cookie,并使用CGI.pm的CGI方法返回正确的http头。CGI::Session的任何参数都将传递给CGI::header()


否则,您将为每个请求创建一个全新的会话。

您的缩进很奇怪,但您的登录脚本似乎定义了几个子例程…并且从未调用它们。这是因为它们在index.pl中被调用,而index.pl需要login.pl。我们这里有一盘很好的意大利面@辛巴基哦,你好你。。。上次你让我哭了,你似乎有进步了。太好了。:)您的缩进很奇怪,但看起来您的登录脚本定义了几个子例程…并且从未调用它们。这是因为它们在index.pl中被调用,而index.pl需要login.pl。我们这里有一盘很好的意大利面@辛巴基哦,你好你。。。上次你让我哭了,你似乎有进步了。太好了。:)哦,好主意x)我做了更改,但没什么不同。您仍然没有提到您是否在web服务器错误日志中看到任何错误。另一种可能性是您有两个
$session
对象(每个文件中一个)。这很可能是混淆问题。我建议让它在一个文件中工作,然后再尝试将其中的一部分分割成一个模块(不是另一个程序-一个真正的Perl模块)。日志中没有错误,问题是load_profile函数出现了,事实是,现在我可以登录了,但我仍然没有会话。如果我再次进入索引,它将打印登录脚本,“登录试用”将无法工作。就像我说的那样,这不会在Cookie中节省一个会话。我怀疑您正在创建两个会话对象这一事实令人困惑。我应该在login.pl或index.cgi中替换一个$session和$cgi声明吗?这让我有点困惑哦,好主意x)我做了更改,但没什么不同。你仍然没有提到你是否在web服务器错误日志中看到任何错误。另一种可能性是您有两个
$session
对象