为什么CGI.pm对象中的某些头信息仍然存在而另一个不存在?

时间:2010-11-22 13:58:27

标签: perl cgi mod-perl

我和我的同事正在维护和开发一个通过mod_perl工作的Perl Web项目。

现在我们正在进行一项主要的遗留代码重构,我们在其中实现了某种MVC模式。

除此之外,我的任务是确保处理所有HTTP响应标头并将其发送回主控制器内的浏览器。例如,如果需要重定向,页面处理程序会抛出异常,然后主控制器捕获它并生成相应的标题。

在我开始实施cookie处理之前,一切顺利。在此之前,我们的代码只是在需要时打印出cookie标题,如下所示:

# $response is an instance of the CGI class
print $response->redirect(
    -uri => "/some_uri/",
    -cookie => $response->cookie(
         -name => 'user_id',
         -value => $user->{'id'},
         -path => '/', -expires => '+1M'));

现在我希望$response对象存储该信息,以便稍后我可以将所有标题一起发送。我认为它会是这样的:

sub page_handler {
    # ...
    $response->cookie(-name => 'user_id',
         -value => $user->{'id'},
         -path => '/', -expires => '+1M');
    return;
}

# And then, inside the controller

sub controller {
    # ...
    # the same $response instance 
    print $response->header();
    print $output;
    # ....
    exit();
}

但似乎CGI类对象不存储它使用header方法创建的所有标头。有些标题似乎仍然存在,而其他标题则没有,这是我在re.pl中得到的结果:

$ use CGI;        
$ my $response = CGI->new();
$CGI1 = CGI=HASH(0xa6efba0);
$ $response->header();
Content-Type: text/html; charset=ISO-8859-1

$ $response->header(-type => 'text/plain', -charset => 'UTF-8', -status => '200 OK');
Status: 200 OK
Content-Type: text/plain; charset=UTF-8

$ $response->header();
Content-Type: text/html; charset=UTF-8 

我希望最后一个输出与前一个输出相同,或者与第一个输出相同,我还没有设置任何标题。我没想到它会部分改变。

这就是为什么我问我的问题:为什么CGI.pm对象中的某些标题信息会持续存在而另一个不存在?

我是否错误地使用了该物体?有没有办法按照我的意图使用它?

PS:很抱歉,我想确保你明白我想做什么。

PPS:另外,我知道这里的很多人建议远离CGI并使用Catalyst。我担心,现在这不是一个选项,因为我们有太多的遗留代码,我们希望完全摆脱mod_perl。这仅适用于某个功能。

1 个答案:

答案 0 :(得分:0)

要回答你的问题,header方法不存储任何信息,没有任何信息是持久性的。

在标题“对象”持续存在的示例中,reading TFM有助于:

  

-charset参数可用于控制发送到浏览器的字符集。如果未提供,则默认为ISO-8859-1。 作为副作用,这也设置了charset()方法。 [强调我的]

使用某些参数调用header后,将其作为默认值调用,唯一“持久化”的是字符集。

对于你的cookie问题,我认为你必须存储$ response-> cookie();某处。 TFM没有说cookie()子句将数据存储在任何地方,只是说它创建了一个cookie。

我同意思南的观点 - 抛出异常是疯狂的谈话,尤其是覆盖CGI.pm的重定向子。我想重新考虑一下。或者完全相反,只使用异常处理编写整个webapp - 沿途有一些好笑:o)