在Catalyst中使用Cache-Control标头时,如何才能发送cookie?

时间:2009-07-24 13:03:07

标签: perl session cookies catalyst

我通过SessionSession::Store::DBICSession::State::Cookie在我的Catalyst应用中使用会话。

我有一些控制器和方法可以发送带有Cache-Control: public标头的数据,因此Set-Cookie:标头与这些响应一起发布至关重要(否则,它会被缓存并发送给其他客户端,从而导致可能的安全问题)。我没有找到实现这个目标的好方法。

如何告诉SessionSession::State::Cookie不发送Cookie以响应给定的请求?

2 个答案:

答案 0 :(得分:1)

做一点RTFS,Session.pm会覆盖Catalyst的finalize_headers 方法并通过一个相当深的调用链将cookie设置在那里:

finalize_header
⇒ _save_session_expires
⇒ session_expires
⇒ _extended_session_expires
⇒ extend_session_id (…::Session::State::Cookie)
⇒ update_session_cookie (…::Session::State::Cookie)

似乎没有任何方法可以标记链中的任何内容 停。唯一的检查是调用Cookie.pm中的方法 cookie_is_rejecting只是将配置的cookie路径与之比较 请求路径。

因此,看起来最好的方法是添加我自己的覆盖 update_session_cookiecookie_is_rejecting。我想我会 使用cookie_is_rejecting

这是我最终使用的代码。请注意,这是相当麻烦的,但它有效......

package Catalyst::Plugin::Session::State::Cookie::Sanity;
use base qw/Catalyst::Plugin::Session::State::Cookie/;

use MRO::Compat;

use strict;

sub cookie_is_rejecting {
    my ($c, $cookie) = @_;

    ($c->stash->{cache_control_time} // 0) > 0
        or $c->maybe::next::method( $c, $cookie );
}

1;

答案 1 :(得分:0)

以这种方式接近它似乎有点不寻常,但我想我得到了你正在做的事情。

如果我没记错的话,Cookie State模块只是在响应对象中设置cookie:

$c->response->cookies

我认为那里没有任何魔法,它只会将其设置为创建或延长会话时间。如果您想确保不发送cookie。清除根目录中的$c->response->cookies,你应该好好去。

JayK