Why doesn't CGI::Sessions work?

我是研究僧i 提交于 2019-12-25 07:13:01

问题


I have two files, one is the login from which I get user credentials and I want to forward the user to another page if he passes authentication using CGI::Sessions. The problem is that I am missing something in the hello.pl file. I looked online for code examples but couldn't find any with two or more files. What should I put in my code in hello.pl in order to redirect using sessions so the variable username can be pulled out from hello.pl

login.pl:

 1 #!/usr/bin/perl -wT
  2  use strict;
  3 
  4 use CGI::Session;
  5 use CGI qw(:standard);
  6 
  7 my %names = map { $_ => 1 } param;
  8 my $open = "1234";
  9 
 10 sub windowLayout() {
 11           header,
 12           start_html("Input Form"),
 13           start_form,
 14           "Please enter your username:",
 15           textfield(-name=>'username',
 16                           -maxlength=>20),p,
 17           "Please enter your password:",
 18           password_field(-name=>'password',
 19                           -maxlength=>20),p,
 20           submit,hr
 21 }
 22 
 23 if ($names{username} and $names{password}) {
 24 
 25 my $cgi = new CGI;
 26 my $session = new CGI::Session(undef, $cgi, {Directory=>'/tmp'});
 27 
 28 my $cookie = $cgi->cookie(CGISESSID => $session->id);
 29 print $cgi->header(-cookie=>$cookie);
 30 
 31 my $username  = param("username");
 32 my $password  = param("password");
 33 
 34 $session->param('username', $username);
 35 $session->param('password', $password);
 36 
 37  if ($password ne $open) {
 38        print
 39         windowLayout(),
 40         end_form,
 41           p({-style=>'Color: red;'},
 42                  "Sorry wrong password!");
 43        print end_html;
 44   } else {
 45        print
 46           redirect("hello.pl");
 47   }
 48  }else {
 49     print
 50          windowLayout(),
 51          end_html;
 52  }

hello.pl

 #!/usr/bin/perl -wT
  2 use strict;
  3 
  4 use CGI::Session;
  5 use CGI qw(:standard);
  6 
  7 #my $cgi = CGI->new;
  8 #my $usrname = $cgi->param("username");
  9 
 10 my $username = $session->param("username");
 11 
 12 print   
 13     header,
 14     start_html (-BGCOLOR=>'green'),
 15     "Hello, $usrname",p,
 16     "The time now is: ",
 17      scalar(localtime),
 18 #     h1({-style=>'Color: orange;'}, "$usrname you win \$1,000,000!");
 19     end_html;

回答1:


I recommend looking at the following question for an additional example on using CGI::Session:

  • How to access variable of other perl program in my perl program

However, your two scripts can be cleaned up to work at transferring the username from one to the other.

The biggest thing I would recommend is setting your CGI object and CGI::Session object first thing. This is true of both of your scripts and any other cgi style scripts that you would create:

login.pl

use strict;
use warnings;

use CGI::Session;
use CGI qw(:standard);

my $open = "1234";

my $cgi = CGI->new;
my $session = CGI::Session->new( undef, $cgi, { Directory => '/tmp' } )
  or die CGI::Session->errstr;
my $username = $cgi->param('username') // '';
my $password = $cgi->param('password') // '';

# Process Form
my @errors;
if ( $cgi->request_method eq 'POST' ) {
    if ( !$username ) {
        push @errors, "No username specified.";
    }

    if ( !$password ) {
        push @errors, "No password specified.";
    }
    elsif ( $password ne $open ) {
        push @errors, "Sorry, wrong password.";
    }

    if ( !@errors ) {
        $session->param( username => $username );
        print $cgi->redirect("hello.pl");
        exit;
    }
}

print $session->header(),
  start_html("Input Form"),
  start_form,
  p(
    "Please enter your username:",
    textfield(
        -name      => 'username',
        -maxlength => 20
    )
  ),
  p(
    "Please enter your password:",
    textfield(
        -name      => 'password',
        -maxlength => 20
    )
  ),
  p(submit), hr,
  end_form,
  map( { p( { -style => 'Color: red;' }, $_ ) } @errors ),
  end_html();

hello.pl

use strict;
use warnings;

use CGI::Session;
use CGI qw(:standard);

my $cgi = CGI->new;
my $session = CGI::Session->new( undef, $cgi, { Directory => '/tmp' } )
  or die CGI::Session->errstr;

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

print header,
  start_html( -BGCOLOR => 'green' ),
  p("Hello, $username"), p( "The time now is: ", scalar(localtime) ),
  end_html;


来源:https://stackoverflow.com/questions/25396539/why-doesnt-cgisessions-work

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!