0

我正在为一个简单的应用程序编写一个简单的身份验证方法

sub Kernel::get_cookie
{
    my ($q, %vars) = @_;

    # Crea la sesion
    my $sid = $q->cookie($vars{'COOKIE_NAME'}) || undef;
    my $session = undef;

    if(!$sid) {
        $session = CGI::Session->new('id:md5', $q, {Directory=>$vars{'SESSION_DIR'}});
    } else {
        $session = CGI::Session->load($q);
    }

    # Genera la cookie
    my $cookie = $q->cookie(
        -name => $vars{'COOKIE_NAME'},
        -value => $session->id
    );

    # regresa la cookie
    return $cookie;
}

# ... in main code
print $q->header(-cookie=>$cookie);

第一次我得到 cookie 很好,但是当我刷新页面时 o 得到 cookie 两次,第二次有一个空白名称

'CGICOOKIE': '1a2c3s4d5d6...'
        '' : '1a2c3s4d5d6...'

我是 perl 的新手(几个小时),我需要一个简单的登录系统,但我发现的示例(全部)不完整或不准确

4

1 回答 1

1

问题源于

$q->cookie(
    -name => $vars{'COOKIE_NAME'},
    -value => $session->id
);

第二次返回会话 ID 字符串,而不是CGI::Cookie第一次返回的对象。


您的代码经过荒谬的扭曲来获取 cookie。让 CGI::Session 处理所有这些!您的整个代码可以替换为:

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

my %vars = (
    COOKIE_NAME => 'CGICOOKIE',
    SESSION_DIR => '/tmp',
);
my $q = CGI->new;
CGI::Session->name($vars{COOKIE_NAME});
my $session = CGI::Session->new('id:md5', $q, {Directory=>$vars{'SESSION_DIR'}});

print $session->header(-type => 'text/plain');
# prints cookie header, too
print 'hi';

参见headerCGI::Session

于 2012-07-30T07:41:09.140 回答