Как я могу перенаправить клиента с одной страницы CGI на другую, используя Perl? - PullRequest
6 голосов
/ 06 сентября 2010

Моя проблема заключается в следующем.После того, как пароль признан действительным, мне нужно перенаправить на 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

Ответы [ 5 ]

21 голосов
/ 06 сентября 2010

Редирект:

print redirect(-url=>'http://localhost/cgi-bin/Main.cgi');

работает только тогда, когда это первое, что отправлено обратно в браузер. Потому что вы отправляете это первым:

print "Content-Type: text/html\n\n";

редирект обрабатывается как контент.

(Перенаправление должно быть первым, что вы отправляете, поскольку оно принадлежит HTTP-заголовкам ответа. Распечатывая \n\n, вы явно завершаете эти заголовки. После этого все, что вы отправляете, является содержимым будет отображаться в браузере.)

5 голосов
/ 21 апреля 2012

вы можете попробовать

print "<META HTTP-EQUIV=refresh CONTENT=\"1;URL=http://localhost/cgi-bin/Main.cgi\">\n";

хитрость CONTENT=\"1 задержит перенаправление страницы примерно на одну секунду

У меня была такая же проблема, поэтому этот трюк сработал для меня довольно хорошо. Код не очень красивый, но он работает.

2 голосов
/ 07 сентября 2010

Смотрите следующее, надеюсь, это даст вам хорошее представление о том, как удерживать поток управления «вправо», и поможет вам точно определить, какие части выполняют, что и что делать, в вашей форме:

#!/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() после строки заголовка, если вам нужно), ивыглядит немного чище.

0 голосов
/ 13 августа 2013

Чтобы перенаправить страницу на другую, используйте следующий метод.

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 для получения дополнительной информации о модуле сеанса.

0 голосов
/ 07 сентября 2010

Самый простой способ - использовать тег обновления 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...