gpt4 book ai didi

perl - 为什么 CGI::Session new 和加载失败(无法解冻())?

转载 作者:行者123 更新时间:2023-12-02 00:29:51 27 4
gpt4 key购买 nike

我尝试使用 CGI::Session 库,但出于某种原因,我的代码无法保持持久 session ...这是将 Perl Moose 用于 OOP,并使用 Moose 构建器来实例化 _cgi 和 _sss( session ) My::Session 对象的参数...

更新代码

我的::角色::持久数据

package My::Role::PersistsData;

use Moose::Role;
use namespace::autoclean;
has '_cgi' => (
is => 'rw',
isa => 'Maybe[CGI]',
builder => '_build_cgi'
);

has '_sss' => (
is => 'rw',
isa => 'Maybe[CGI::Session]',
builder => '_build_sss'
);

我的:: session

    package My::Session;

use Moose;
use namespace::autoclean;
with 'My::Role::PersistsData';

use CGI;
use CGI::Session ('-ip_match');
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;

sub start{
my($self) = @_;
my $cgi = $self->cgi();
$self->log("Session Started!");
}


sub cgi{
my($self) = @_;
$self->_cgi = $self->_build_cgi() unless $self->_cgi;
return ($self->_cgi);
}


sub _build_cgi{
my($self) = @_;
my $cgi = CGI->new();

if(!$cgi){
#print "mising cgi";
}

return ( $cgi );
}


sub _build_sss{
my($self) = @_;
my $cgi = $self->cgi();

my $sid = $cgi->cookie("CGISESSID") || $cgi->param('CGISESSID') || undef;

$self->log("Session ID Initial is: ".($sid?$sid:"undef"));

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



my $cookie = $cgi->cookie(CGISESSID => $sss->id() );


$self->log("Resulting Session ID is: ".$sid." cookie is: ".$cookie);

print $cgi->header( -cookie=>$cookie );

return ( $sss );
}

ma​​in.pl

use Data::Dumper; 
$Data::Dumper::Sortkeys = 1;

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use My::Session;

$| = 1;
$, = " ";
$\ = "\n <br />";

my $sss = My::Session->new();
$sss->start();
print Dumper($sss);

这很奇怪,因为我第一次运行它时我得到了一个实际的 CGISESSION ID 并且我能够在页面刷新时携带它...

但是,如果我再次加载页面,$sss( session )突然返回为未定义,此时它应该返回一个新的 Session 对象:

 $sss = new CGI::Session("driver:File", $sid, {Directory=>'/tmp'})

由于某种原因 $sss 返回时未定义,这意味着它没有启动新 session 。对我的代码进行一些调整后发现了这个错误:

new(): failed: load(): couldn't thaw() data using CGI::Session::Serialize::default:thaw(): couldn't thaw. syntax error at (eval 253) line 2, near &quot;/&gt;&quot; 

我还在 CGI::Session.pm 中四处窥探,发现了这个错误被抛出的位置,我猜它无法解析 _DATA 甚至无法读取它......因为一些奇怪的字符......“/> "

CGI::Session.pm

....
$self->{_DATA} = $self->{_OBJECTS}->{serializer}->thaw($raw_data);
unless ( defined $self->{_DATA} ) {
#die $raw_data . "\n";
return $self->set_error( "load(): couldn't thaw() data using $self->{_OBJECTS}->{serializer} :" .
$self->{_OBJECTS}->{serializer}->errstr );
}

知道为什么这不起作用吗?

最佳答案

这很可能是由于发送了不同的 session cookie(在那里,用头撞墙。很难)。

请打印最初用于存储 session 的 session cookie 值以及后续请求提供的 session cookie 值。

如果它们确实不同,您有 2 个选择:

  • 调查浏览器在后续请求中发送不同 session cookie 的原因,并以某种方式解决该问题。

    我一直没能找到决定性的答案,但我的应用程序包含一个内部框架 <iframe>所以我怀疑是因为那个。

  • 如果像我一样找不到根本原因,您也可以解决这个问题。

    我的解决方法:将原始 session cookie 值显式存储为表单变量,并在 100% 的代码片段中传递。

    然后在服务器端代码请求 session 数据之前使用正确的 cookie 值重新初始化 session 对象。

    不是很安全,烦人,很难正确。但是有效。我不会推荐它,除非作为 super 最后的手段黑客

关于perl - 为什么 CGI::Session new 和加载失败(无法解冻())?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com