2010-09-06 40 views
6

Vấn đề của tôi là như sau. Sau khi mật khẩu được công nhận là hợp lệ tôi cần phải chuyển hướng đến main.cgi nhưng tôi nhận được thông báo như sau:Làm cách nào để chuyển hướng khách hàng từ trang CGI này sang trang khác bằng Perl?

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

tôi biết lý do cho điều này là tôi đang viết bản Tuyên Bố này sau Content-Type vì vậy nó được dùng này dưới dạng HTML và in trên màn hình. Tôi là một newbie để Perl. Ai có thể vui lòng giúp tôi tìm ra giải pháp cho việc này và làm cho mã của tôi hoạt động theo cách tôi muốn? Hoặc vui lòng đề xuất cho tôi một số mã thay thế cho điều này hoặc bất kỳ liên kết nào có thể giúp tôi.

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

Chưa thực sự xem xét điều này, như bạn đã nói, bạn mới và điều này có nhiều vấn đề về cấu tạo tốt, nhưng in loại nội dung sau này, nếu bạn biết trường hợp đó. – vol7ron

+0

HEY THANKS ALOT ... tôi đã đặt nó lên trên bản in << END1 ... nó hoạt động hoàn toàn điều hướng đến trang có ý định..bt nếu tôi nhập sai mật khẩu sau đó thay vì dispalying "mật khẩu không hợp lệ" .. trang là nhận được làm mới thas al ..tôi đã thử puttin nó jst abve tuyên bố in "không hợp lệ mật khẩu"; ,, bt của nó cho một LRI: INTERNAL MÁY L ERI ERROR ,,,,, wen tôi kiểm tra các bản ghi lỗi sau đó ths s wat tôi phát hiện ra .. "tiêu đề không đúng từ Tiêu đề không hợp lệ = : Login.cgi ", .. ĐÂY LÀ MỘT ĐỀ XUẤT MỚI NGAY BÂY GIỜ ... hãy giúp tôi giải quyết nó, nếu nó được giải quyết thì mọi vấn đề trong chương trình của tôi được sắp xếp ... – sonya

+1

có thể trùng lặp [Chuyển hướng từ trang CGI này sang trang khác] (http://stackoverflow.com/questions/3649762/redirecting-from-one-cgi-page-to-another) – daxim

Trả lời

21

Các chuyển hướng:

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

chỉ hoạt động khi đó là điều đầu tiên được gửi lại cho trình duyệt. Vì bạn gửi thư này trước tiên:

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

chuyển hướng đang được coi là nội dung.

(Chuyển hướng phải là điều đầu tiên bạn gửi vì nó nằm trong tiêu đề HTTP của phản hồi. Bằng cách in \n\n, bạn rõ ràng sẽ chấm dứt các tiêu đề đó. Sau đó, mọi thứ bạn gửi đều là nội dung và sẽ là được hiển thị bởi trình duyệt.)

2

Xem phần sau, hy vọng nó sẽ giúp bạn hiểu rõ cách giữ luồng kiểm soát "bên phải" và sẽ giúp bạn xác định chính xác phần nào sẽ làm gì và làm gì, trong form:

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

Đừng bận tâm bạn không bao giờ sử dụng thông số "Đăng nhập" ... ms chuyển hướng như bạn muốn nó, hiển thị các lỗi không có hình thức (sử dụng một print my_form() sau dòng tiêu đề nếu bạn cần), và nhìn chung một chút tidier.

+0

Xin cảm ơn rất nhiều Mr.mfontani..i đã dán mã này .. bất cứ khi nào tôi đưa ra một mật khẩu hợp lệ sau đó nó nhận được chuyển hướng đến Main.cgi .. Nhưng khi tôi đưa ra mật khẩu sai thì một hộp thoại xuất hiện hỏi "YOu muốn lưu hoặc mở tệp Login.cgi" .. và khi nào tôi bấm mở sau đó của nó DIsplaying các MEsSage "mật khẩu không hợp lệ" trong PERL EXPRESS ... thực sự đang sử dụng PERL EXPRESS để thực hiện prol perl của tôi ams .. – sonya

+0

Bạn cần sử dụng $ q-> header ('text/plain') ở trên trong những trường hợp bạn chỉ phát ra lỗi và $ q-> header ('text/html') khi trình bày hình thức; cập nhật – mfontani

-4

Cách dễ nhất là sử dụng thẻ làm mới META, bạn cũng sẽ không cần phải regig tiêu đề của mình.

Sử dụng mã này:

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

Một triệu nhờ Mr.Darren..it hoạt động chính xác theo cách tôi muốn nó hoạt động .. sau khi mật khẩu hợp lệ, nó hiển thị lại biểu mẫu trong một thời gian và sau đó chuyển nó đến main.cgi ... NHƯNG APART TỪ RATNG EVRY BIT WORKS PROPERLY .... tahnks rất nhiều .... – sonya

+6

Meta Refresh là những gì bạn sử dụng khi bạn không thể làm điều đó một cách chính xác, như trong câu trả lời bình chọn cao nhất trong câu hỏi này. –

+0

Cảm ơn Brian, nhưng nó đã được khá rõ ràng Sonya đã tìm kiếm một giải pháp đơn giản với ít viết lại càng tốt. –

4

bạn có thể muốn thử

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

lừa được CONTENT=\"1 sẽ trì hoãn trang chuyển hướng cho khoảng một giây

tôi đã cùng một vấn đề vì vậy đây lừa đã làm việc cho tôi khá tốt. Mã không đẹp nhưng nó hoạt động.

0

Để chuyển hướng trang khác sử dụng phương pháp sau.

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

Tìm kiếm www.search.cpan.org để biết thêm chi tiết về mô-đun phiên.

Các vấn đề liên quan