0
我正在写一个接收POST方法提交的小Perl页面。我希望能够防止单个人/计算机多次提交表单(以避免重复提交泛滥)。但是我无法找到关于如何在Perl CGI中执行此操作的示例或解释。你能建议还是直接给我一些例子? 我知道我可以使用来自HTTP标头(令牌?)的一些数据和/或第一次提交后种植一个cookie,但我不知道如何。避免用户使用Perl提交表单两次(CGI)
任何帮助将不胜感激。 最好的问候, -Arseny
我正在写一个接收POST方法提交的小Perl页面。我希望能够防止单个人/计算机多次提交表单(以避免重复提交泛滥)。但是我无法找到关于如何在Perl CGI中执行此操作的示例或解释。你能建议还是直接给我一些例子? 我知道我可以使用来自HTTP标头(令牌?)的一些数据和/或第一次提交后种植一个cookie,但我不知道如何。避免用户使用Perl提交表单两次(CGI)
任何帮助将不胜感激。 最好的问候, -Arseny
避免用户多次单击按钮的最简单方法是将一些JavaScript添加到您的页面。这将不起作用的脚本或即按F5。
<input type="submit" name="go" id="go" value="go" onclick="this.disabled='disabled'"/>
你也可以写保存用户和时间标记的IP地址的服务器上的日志文件/数据库,并检查他是否为已提交。除了设置和检查cookie之外,这样做可能是一条路。
有关cookie,请参阅CGI
文档中的cookies。简单的例子:
use strict; use warnings;
use CGI;
my $q = new CGI;
my $submitted = 0;
if ($q->cookie('submitted ')) {
$submitted = 1;
}
# Here you could place the file/db check to also set $voted
if ($submitted) {
print $q->header('text/plain');
print "You have already submitted!";
} else {
# Do stuff with the form, like $q->param('foo')...
# Once you're done, place the cookie
print $q->header(
-type => 'text/plain',
-cookie => $q->cookie(
-name => 'submitted',
-value => 1,
-expires => '+1y',
));
}
谢谢! 你能否告诉我在哪里可以得到我的CGI提交者的IP?它会在CGI类型对象的某个地方吗? – 2012-07-16 13:21:07
'$ q-> remote_addr()' - 参见[获取环境变量](http://search.cpan.org/dist/CGI/lib/CGI.pm#FETCHING_ENVIRONMENT_VARIABLES) – simbabque 2012-07-16 13:30:04