为什么CGI :: Session不起作用? [英] Why doesn't CGI::Sessions work?

查看:59
本文介绍了为什么CGI :: Session不起作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个文件,一个是登录名,我从中获得用户凭证,如果他使用CGI :: Sessions通过身份验证,则希望将用户转发到另一个页面.问题是我在hello.pl文件中丢失了某些内容.我在网上查找了代码示例,但找不到两个或更多文件.我应该在hello.pl中的代码中添加什么以便使用会话进行重定向,以便可以从hello.pl中提取变量用户名

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;

推荐答案

对于使用 CGI :: Session :

但是,您可以清理两个脚本,以将用户名从一个转移到另一个.

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

我建议的最大方法是,首先设置您的 CGI 对象和 CGI :: Session 对象.这对您的脚本以及将要创建的任何其他cgi样式脚本都是如此:

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;

这篇关于为什么CGI :: Session不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆