【问题标题】:Strange Apache2::Cookie error under Strawberry Perl and mod_perl2Strawberry Perl 和 mod_perl2 下奇怪的 Apache2::Cookie 错误
【发布时间】:2011-05-07 13:26:06
【问题描述】:

我有一组在 ActivePerl 5.10 下运行的脚本。但是,在 Strawberry Perl 5.10 下,我收到一条奇怪的错误消息:

Can't locate object method "cookie_class" via package "MyCookie" (perhaps you forgot to load "MyCookie"?) at C:/strawberry/perl/site/lib/Apache2/Cookie.pm line 41.

但是,MyCookie 是 cookie 本身的名称,而不是任何 Perl 包的名称。

如果我注释掉 Cookie.pm 的第 41 行,脚本会运行,但我无法再成功获取或设置 cookie。

错误消息似乎有些正确,因为我也找不到cookie_class(除了在 POD 文件中提到的地方。)也就是说,我的 ActivePerl 安装也是如此。

我看是在C:\strawberry\perl\site\lib\auto\APR\Request\Request.dll--怎么在Strawberry下找不到,在ActivePerl下可以找到?

【问题讨论】:

    标签: perl cookies apache2 mod-perl2 strawberry-perl


    【解决方案1】:

    更改您的代码以使用 2.X 方案,如下所示:

    my $j = Apache2::Cookie::Jar->new($r);
    my $cookie = $j->cookies("MyCookie"); # works!  go figure...
    

    而不是旧方法:

    local our %cookies = Apache2::Cookie->fetch($r); # error was happening here
    local our $cookie = $cookies{"MyCookie"};
    

    (出于某种原因,这似乎解决了它。)

    【讨论】:

    • 奇怪的是,老派fetch 使用 ActivePerl 而不是 Strawberry。 Apache2::Cookie::Jar 有效,而且我想是正确的方法,所以恭喜您解决了这个问题。
    • 这很奇怪——现在我遇到了同样奇怪的 Apache2::Request::param 问题,但我认为我已经在“以正确的方式”进行操作了。无论如何,感谢您的确认和道具对我的帮助很大。 :)
    【解决方案2】:

    您是否可能在 Strawberry 和 ActivePerl 版本之间混合使用 apreq DLL?或者以某种方式混合 apreq-1 和 apreq-2 DLL?

    有问题的cookie_class 电话周围的区域是这样的:

    my $jar = $req->jar or return;
    $jar->cookie_class(__PACKAGE__);
    return $jar->get(shift) if @_;
    

    cookie_class 方法确实来自 Request.dll,并且在调用 jar() 之前对 $req 进行了类型检查。

    【讨论】:

    • 我看不到。我按照mail-archives.apache.org/mod_mbox/perl-modperl/201007.mbox/… 的说明进行操作,他们让它从 KMX 的草莓专用版本中安装 mod_perl2。
    • 你自己调用“$r->jar”会得到什么?你得到一个对象吗?标量?有“cookie_class()”方法的东西?
    • 我收到Can't locate object method "jar" via package "Apache2::RequestRec"
    • 如果你说my $req = APR::Request::Apache2->handle($r); $req->jar;?我只是逐行浏览 Apache2::Cookie::fetch 顺便说一句,希望会有所收获。
    • (奇怪的是,$req->isa("APR::Request") 返回1,所以你建议的代码,即调用handle,不应该在fetch'通常'中执行......)
    【解决方案3】:

    在某个地方,您或其他人正在将字符串传递给需要对象的函数。调试的最佳第一步是加载Carp::Always,这样您就可以获得回溯并找出真正发生的情况。

    【讨论】:

    • 我做了一个堆栈跟踪。但真正发生的事情与一直在发生的事情相同:%cookies = Apache2::Cookie->fetch($r) 其中$rApache2::RequestRec 对象。相同的代码在 ActivePerl 下运行良好,无需更改。此外,在它崩溃的代码中,MyCookie 尚未检查(不是它已传递给 fetch()),所以我假设它是从浏览器的实际 cookie 中获取的。
    • 我删除了浏览器的cookie,果然不再出错了。但是,现在它也不再成功设置 cookie。
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2012-02-02
    • 1970-01-01
    • 2013-12-20
    • 2021-07-23
    • 2012-08-12
    相关资源
    最近更新 更多