代码之家  ›  专栏  ›  技术社区  ›  derobert

当我在Catalyst中使用缓存控制头时,如何不发送cookie?

  •  3
  • derobert  · 技术社区  · 16 年前

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

    我有一些控制器和方法可以用 Cache-Control: public 头,所以它的本质是 Set-Cookie: 页眉 拿出这些响应(否则,它将被缓存并发送到其他客户机,从而导致可能的安全问题)。我还没有找到一个很好的方法来实现这一点。

    我怎样才能告诉你 会话 会话::状态::cookie 不发送cookie来响应给定的请求?

    2 回复  |  直到 16 年前
        1
  •  1
  •   derobert    16 年前

    做一点RTF, 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_cookie 曲奇是拒绝 . 我想我会的 使用 曲奇是拒绝 .

    这是我最后使用的代码。注意,这是相当笨拙,但它工作…

    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;
    
        2
  •  0
  •   Brad Gilbert    16 年前

    这种方法看起来有点不寻常,但我想我知道你在做什么。

    如果我记得正确,cookie状态模块只需在响应对象中设置cookie:

    $c->response->cookies
    

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

    杰克