2010-09-06 17 views
6

Mi problema es el siguiente. Después de la contraseña es reconocido como válido lo que necesito para redirigir a main.cgi pero yo estoy recibiendo el mensaje como:¿Cómo puedo redirigir al cliente de una página CGI a otra usando Perl?

Status: 302 Found 
Location: http://localhost/cgi-bin/Main.cgi 

Sé que la razón de esto es que estoy escribiendo esta declaración después de Content-Type por lo que está tomando esto como HTML e imprimiéndolo en la pantalla. Soy un novato para Perl. ¿Puede alguien ayudarme a encontrar la solución para esto y hacer que mi código funcione como yo quiero? O sugiérame algún código alternativo para esto o cualquier enlace que pueda ayudarme.

#!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 
+2

Realmente no he mirado esto, como dijiste, eres nuevo y esto tiene muchos problemas de buena formación, pero imprime el tipo de contenido más adelante, si sabes ese el caso. – vol7ron

+0

HEY GRACIAS MUCHO ... lo puse por encima de la impresión << END1 ... funciona perfectamente navegando hacia la página intencionada ... pero si ingreso la contraseña incorrecta, en lugar de mostrar "contraseña no válida" ... la página se está renovando thas al ..intenté ponerlo primero sobre la declaración imprimir "contraseña inválida"; ,, bt está dando un ERROR: ERROR INTERNO DEL SERVIDOR ,,,,,, cuando compruebe los registros de error entonces esta s wat me enteré .. "encabezado malformado de script. Bad header = : Login.cgi ", .. ESTO ES UN NUEVO NÚMERO AHORA ... por favor ayúdenme a resolverlo, si se resuelve, entonces se resuelven todos los problemas en mi programa ... – sonya

+1

posible duplicado de [Redireccionamiento de una página CGI a otra] (http://stackoverflow.com/questions/3649762/redirecting-from-one-cgi-page-to-another) – daxim

Respuesta

21

La redirección:

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

sólo funciona cuando es la primera cosa enviado de vuelta al navegador. Porque está enviando esto primero:

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

la redirección se está tratando como contenido.

(El redireccionamiento debe ser lo primero que envíe porque pertenece a los encabezados HTTP de la respuesta. Al imprimir su \n\n, está terminando explícitamente dichos encabezados. Después de eso, todo lo que envíe será contenido y será mostrado por el navegador.)

2

Consulte lo siguiente, con suerte le dará una buena idea sobre cómo mantener el flujo de control "hacia la derecha" y le ayudará a identificar exactamente qué piezas hacen y qué deben hacer qué, en su formulario:

#!/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 
} 

No importa que nunca utilice el parámetro "Iniciar sesión" ... el rendimiento anterior ms la redirección como lo desee, muestra los errores sin forma (utilice un print my_form() después de la línea del encabezado, si es necesario), y se ve en general un poco más ordenado.

+0

Hola gracias Sr.mfontani..i pegado este código ... siempre que entregue una contraseña válida, se redirecciona al Main.cgi ... pero cuando proporciono la contraseña incorrecta aparece un cuadro de diálogo que pregunta "Desea guardar o abrir el archivo Login.cgi" ... y cuándo hago clic en Abrir y luego aparece la "contraseña inválida" de MEsSage en PERL EXPRESS ... en realidad estoy usando PERL EXPRESS para ejecutar mi programa perl ams .. – sonya

+0

Necesita usar $ q-> header ('text/plain') arriba en las ocasiones en que solo está dando los errores, y $ q-> header ('text/html') al presentar el formar; actualizado – mfontani

-4

La manera más fácil es utilizar la etiqueta de actualización META, no necesita marcar su encabezado tampoco.

Usar este código:

#!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 
+0

Un millón de gracias Sr.Darren ... funciona exactamente como yo quería que funcione ... después de una contraseña válida muestra el formulario de nuevo por un tiempo y luego lo redirecciona a main.cgi ... PERO APARTAR DE ESO EVRY BIT FUNCIONA CORRECTAMENTE .... tahnks mucho ... – sonya

+6

Meta Refresh es lo que usa cuando no puede hacerlo correctamente, como en la respuesta más votada en esta pregunta. –

+0

Gracias Brian, pero era bastante obvio que Sonya estaba buscando una solución simple con la menor reescritura posible. –

4

es posible que desee probar

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

el truco es CONTENT=\"1 retrasará la página de redirección durante aproximadamente un segundo

que tenía el mismo problema por lo que este El truco funcionó para mí bastante bien. El código no es bonito, pero funciona.

0

Para redirigir una página a otra, utilice el siguiente método.

use CGI::Session; 
use CGI::Session::Plugin::Redirect; 
my $session = new CGI::Session(); 
print $session->redirect('http://example.com/redirect-path/redirect-file.php'); 

Buscar www.search.cpan.org para obtener más información sobre el módulo de sesión.

Cuestiones relacionadas