【问题标题】:How can I not send a cookie when I use the Cache-Control header in Catalyst?在 Catalyst 中使用 Cache-Control 标头时如何不发送 cookie?
【发布时间】:2010-11-13 17:34:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl session cookies catalyst


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

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

      $c->response->cookies
      

      我不认为那里有什么魔法,它只是设置它来创建或延长会话时间。如果您想确保不发送任何 cookie。清除 Root 端的 $c->response->cookies,您应该可以开始了。

      周杰伦

      【讨论】:

      • 如果有更好/更常用的方法来解决这个问题,我很想听听。这是我的第一个真正的 Catalyst 应用程序,所以我很可能无缘无故地以愚蠢的方式做事。
      • $c->log->debug("Cookies are: " . pp($c->response->cookies)); 在我的根目录中将 cookie 记录为一个空的哈希值,但仍然在发送 Set-Cookie。
      • [info] *** 请求 9 (1.125/s) [10894] [Mon Jul 27 11:20:48 2009] *** [debug] "GET" request for "js/tools / e3f84575109c4612819ae19e28973135" ,从 “172.16.1.241”[调试]路径是 “JS”[调试]参数是 “工具/ e3f84575109c4612819ae19e28973135”[调试]发现会话ID “f356a9509668ea25f70b6b8dd2edef318dad95a1” 中的cookie [调试]恢复会话 “f356a9509668ea25f70b6b8dd2edef318dad95a1”[调试] Cookies是: {} [debug] 渲染模板“js/tools.js” [debug] 以文本形式传递页面:js/tools.js [info] 请求耗时 0.110160s (9.078/s)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多