我的问题如下。密码被识别为有效后,我需要重定向到main.cgi
,但我收到的消息为:
Status: 302 Found
Location: http://localhost/cgi-bin/Main.cgi
我知道这样做的原因是我在Content-Type
之后写这个语句所以它将它作为HTML并在屏幕上打印。我是Perl的新手。任何人都可以帮我找到解决方案,让我的代码按照我想要的方式工作吗?或者,请为此建议一些替代代码,或任何可能帮助我的链接。
#!C:\perl\bin\perl.exe
use strict;
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use DBI;
my $q = new CGI;
print "Content-Type: text/html\n\n";
if ($q->param("Login")) {
my $Password = param('Password');
if (!$Password) {
print "Please Enter the Password";
} else {
my $dbh = DBI->connect(
"dbi:SQLite:DEVICE.db",
"", "",
{
RaiseError => 1,
AutoCommit => 1
}
);
my $sth = $dbh->prepare("select * from Settings where Password = ?");
$sth->execute($Password);
if (my $pass = $sth->fetchrow_hashref) {
print redirect(-url => 'http://localhost/cgi-bin/Main.cgi');
} else {
print "Invalid Password";
}
$dbh->disconnect;
}
}
print <<END1;
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
<body>
<form NAME="login" METHOD="POST">
<input type="hidden" name="submit" value="Submit">
<TABLE align="center" bgcolor=#B0C4DE>
<TR>
<TD> Enter The Password And Click Login</TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TR>
<TD align="center" colspan="2">
<input type="submit" name="Login" value="Login">
<input type="reset" name="submit" value="Cancel">
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
END1
答案 0 :(得分:21)
重定向:
print redirect(-url=>'http://localhost/cgi-bin/Main.cgi');
仅在发送回浏览器的第一件事情时才有效。因为你先发送这个:
print "Content-Type: text/html\n\n";
重定向被视为内容。
(重定向必须是您发送的第一件事,因为它属于响应的HTTP标头。通过打印您的\n\n
,您明确地终止了这些标头。之后,您发送的任何内容都是内容并将由浏览器显示。)
答案 1 :(得分:4)
您可能想尝试
print "<META HTTP-EQUIV=refresh CONTENT=\"1;URL=http://localhost/cgi-bin/Main.cgi\">\n";
技巧是CONTENT=\"1
将页面重定向延迟大约一秒
我有同样的问题,所以这个技巧对我很有用。 代码不漂亮,但它的工作原理。
答案 2 :(得分:2)
请参阅以下内容,希望它能让您更好地了解如何将控制流“保持在正确的位置”,并帮助您准确地确定哪些部分可以做什么,并且应该以您的形式做什么:
#!/usr/bin/env perl
# Windows does not use #! to launch stuff!
use strict;
use warnings; # always!
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use DBI;
my $q = CGI->new;
my_program:
{
if ( !$q->param('Login') or !length $q->param('Login') ) {
print $q->header('text/html'), my_form(); # just display the form
last my_program;
}
my $password = $q->param('Password');
if ( !$password or !length $password ) {
print $q->header('text/plain'), "Please enter the Password";
last my_program;
}
my $dbh = DBI->connect(
"dbi:SQLite:DEVICE.db",
"", "",
{
RaiseError => 1,
AutoCommit => 1
}
);
my $sth = $dbh->prepare("select * from Settings where Password = ?");
$sth->execute($password);
if (my $pass = $sth->fetchrow_hashref) {
print redirect(-url => 'http://localhost/cgi-bin/Main.cgi');
last my_program;
}
print $q->header('text/plain'), "Invalid Password";
}
sub print_my_form {
return <<END1;
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
<body>
<form NAME="login" METHOD="POST">
<input type="hidden" name="submit" value="Submit">
<TABLE align="center" bgcolor=#B0C4DE>
<TR>
<TD> Enter The Password And Click Login</TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TR>
<TD align="center" colspan="2">
<input type="submit" name="Login" value="Login">
<input type="reset" name="submit" value="Cancel">
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
END1
}
别介意你永远不要使用“登录”参数...上面按你的意愿执行重定向,显示没有表格的错误(如果需要,在标题行后面使用print my_form()
),看起来通常有点整洁。
答案 3 :(得分:0)
要将页面重定向到另一个页面,请使用以下方法。
use CGI::Session;
use CGI::Session::Plugin::Redirect;
my $session = new CGI::Session();
print $session->redirect('http://example.com/redirect-path/redirect-file.php');
搜索www.search.cpan.org
以获取有关会话模块的更多详细信息。
答案 4 :(得分:-4)
最简单的方法是使用META刷新标记,您也不需要重新获得标题。
使用此代码:
#!C:\perl\bin\perl.exe
use strict;
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use DBI;
my $q = new CGI;
my $redirect = 0;
print "Content-Type: text/html\n\n";
if ($q->param("Login")) {
my $Password = param('Password');
if (!$Password) {
print "Please Enter the Password";
} else {
my $dbh = DBI->connect(
"dbi:SQLite:DEVICE.db",
"", "",
{
RaiseError => 1,
AutoCommit => 1
}
);
my $sth = $dbh->prepare("select * from Settings where Password = ?");
$sth->execute($Password);
if (my $pass = $sth->fetchrow_hashref) {
$redirect = 1;
} else {
print "Invalid Password";
}
$dbh->disconnect;
}
}
print <<END1;
<HTML>
<HEAD>
END1
if ($redirect){
print '<meta http-equiv="refresh" content="1;url=http://localhost/cgi-bin/Main.cgi/">';
}
print <<END2;
<TITLE> </TITLE>
</HEAD>
<body>
<form NAME="login" METHOD="POST">
<input type="hidden" name="submit" value="Submit">
<TABLE align="center" bgcolor=#B0C4DE>
<TR>
<TD> Enter The Password And Click Login</TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD>
</TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR></TR>
<TR>
<TR>
<TD align="center" colspan="2">
<input type="submit" name="Login" value="Login">
<input type="reset" name="submit" value="Cancel">
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
END2