2014-07-09 73 views
0

我有兩個cgi腳本。 Login.cgi和welcome.cgi 我想 這兩個頁面之間。在此傳遞變量是兩頁,我有在cgi/perl中通過重定向傳遞變量

#!C:/Perl/bin/perl.exe -w 
#login.cgi 
use strict; 
use warnings; 

use CGI::Pretty qw(:all); 

my $cgi  = new CGI; 
my $username = $cgi->param('username'); 
my $password = $cgi->param('password'); 

if (($cgi->param('username') eq 'demo') && ($cgi->param('password') eq 'demo')) { 
    print $cgi->redirect("welcome.cgi"); 
} 
else { 
    print header(); 
    print start_html(-title => "Login"); 
    if ($cgi->param('username') or $cgi->param('password')) { 
     print center(font({ -color => 'red' }, "Invalid input")); 
    } 
    print generate_form(); 
    print end_html(); 
} 

sub generate_form { 
    return start_form, 
     h1("Please Login"), 
     p("username", textfield('username')), 
     p("password", textfield('password')), p(submit), 
     end_form; 
} 

另一個頁面welcome.cgi

#!C:/Perl/bin/perl.exe -w 
#welcome.cgi 
use warnings; 
use CGI::Pretty qw(:all); 
use strict; 
my $cgi=new CGI; 
my $username; 
print header(); 
print start_html("Welcome"),h1("Hello, $username"); 
print end_html(); 

如何獲得用戶名變量傳遞給welcome.cgi?

+0

請更換'我的$ CGI =用'我$ CGI = CGI-> new'新CGI'。這種差別是微妙的,但如果你養成了總是調用'new'的習慣,它將在未來某個時候爲你節省大量的調試時間。 –

回答

1

使用CGI::Session

有關的所有不同的方式傳遞腳本,爲什麼這個實現是一個不錯的選擇之間的信息的教程,閱讀CGI::Session::Tutorial

實施了您的登錄腳本:

#login.cgi 
use strict; 
use warnings; 

use CGI::Pretty qw(:all); 
use CGI::Session; 

my $cgi  = new CGI; 
my $session = CGI::Session->new($cgi) or die CGI->Session->errstr; 
my $username = $cgi->param('username') // ''; 
my $password = $cgi->param('password') // ''; 

if ($username eq 'demo' && $password eq 'demo') { 
    $session->param(username => $username); 
    print $cgi->redirect("welcome.cgi"); 
    exit; 
} 

print $session->header(); 
print start_html(-title => "Login"); 
if ($username or $cgi->param('password')) { 
    print center(font({ -color => 'red' }, "Invalid input")); 
} 
print start_form, 
    h1("Please Login"), 
    p("username", textfield('username')), 
    p("password", textfield('password')), p(submit), 
    end_form, 
    end_html(); 

而且在你的歡迎腳本:

#welcome.cgi 
use strict; 
use warnings; 

use CGI::Pretty qw(:all); 
use CGI::Session; 

my $cgi  = new CGI; 
my $session = CGI::Session->new($cgi) or die CGI->Session->errstr; 

my $username = $session->param('username'); 

print header(); 
print start_html("Welcome"),h1("Hello, $username"); 
print end_html(); 
1

您可以直接通過它(通過在query string編碼,並補充說,到URL要重定向到),也可以將其存儲在cookiesession,然後在其他腳本檢索。

0

我不得不稍微不同意米勒先生的意見。 CGI :: Session是目前在許多方面已經過時特別是由於:

  1. 設置Cookie是過時的方法,並沒有堅持RFC6265
  2. 該Cookie ID算法不夠安全,筆者已轉向其他項目。

因此,除非出於教育目的,否則不應使用。

至於原來的問題,你可以看看這個簡單的教程 http://practicalperl5.blogspot.in/2014/07/perl-login-script.html

+0

問候隊友。如果在我的帖子中增加一條關於這個想法的評論會很有幫助,但幸運的是我碰巧碰到了。無論如何,我相信我有點贊同你的想法(將不得不閱讀更多)。然而,更大的想法是'CGI'本身已經過時了,這是爲什麼它很快就會從Perl核心中移除的原因。因此'CGI :: Session'可能仍然是使用CGI跟蹤會話的最佳選擇,但如果您知道任何更好的選擇,我會反覆嘗試。 – Miller

+0

我認爲最好是,如果你看一下RFC6265,瞭解cookies的真正功能。我的意思是「真的」。 cookie在登錄時設置(如果成功),並在成員頁面上讀取(如果不是,用戶重定向到首頁) 爲了幫助你,下面是一個我寫的小教程一段時間回來: http://rikacomet.blogspot.in/2014/01/setting-cookies-in-perl-rfc-6265.html PS:由於我的代表低於50,我不能首先根據這個網站機制發表評論。所以別無選擇,只能回覆。 –