3

我在我的 Catalyst 应用程序中通过SessionSession::Store::DBIC和使用会话Session::State::Cookie

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

我如何判断SessionSession::State::Cookie不发送 cookie 以响应给定的请求?

4

2 回答 2

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_cookieor 或cookie_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;
于 2009-07-27T20:46:15.027 回答
0

以这种方式处理它似乎有点不寻常,但我想我明白你在做什么。

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

$c->response->cookies

我不认为那里有什么魔法,它只是设置它来创建或延长会话时间。如果您想确保不发送任何 cookie。在根端清除$c->response->cookies,你应该很高兴。

周杰伦

于 2009-07-24T17:38:23.170 回答