我通过Session
,Session::Store::DBIC
和Session::State::Cookie
在我的Catalyst应用中使用会话。
我有一些控制器和方法可以发送带有Cache-Control: public
标头的数据,因此Set-Cookie:
标头不与这些响应一起发布至关重要(否则,它会被缓存并发送给其他客户端,从而导致可能的安全问题)。我没有找到实现这个目标的好方法。
如何告诉Session
或Session::State::Cookie
不发送Cookie以响应给定的请求?
答案 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_cookie
或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;
答案 1 :(得分:0)
以这种方式接近它似乎有点不寻常,但我想我得到了你正在做的事情。
如果我没记错的话,Cookie State模块只是在响应对象中设置cookie:
$c->response->cookies
我认为那里没有任何魔法,它只会将其设置为创建或延长会话时间。如果您想确保不发送cookie。清除根目录中的$c->response->cookies
,你应该好好去。
JayK