Как я не могу отправить куки, когда я использую заголовок Cache-Control в Catalyst? - PullRequest
3 голосов
/ 24 июля 2009

Я использую сеансы в своем приложении Catalyst через Session, Session::Store::DBIC и Session::State::Cookie.

У меня есть несколько контроллеров и методов, которые отправляют данные с заголовком Cache-Control: public,поэтому очень важно, чтобы заголовок Set-Cookie: , а не передавался с этими ответами (в противном случае он кэшировался и отправлялся другим клиентам, что приводило к возможным проблемам безопасности). Я не нашел хорошего способа сделать это.

Как я могу сказать Session или Session::State::Cookie не отправлять куки в ответ на данный запрос?

Ответы [ 2 ]

1 голос
/ 28 июля 2009

Выполняя небольшую 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;
0 голосов
/ 24 июля 2009

Кажется немного необычным подход к нему таким образом, но я думаю, что я понимаю, что вы делаете.

Если я правильно помню, модуль Cookie State просто устанавливает cookie в объекте ответа:

$c->response->cookies

Я не думаю, что там есть какая-то магия, а он только устанавливает ее для создания или продления времени сеанса. Если вы хотите, чтобы куки не отправлялись. Очистите $c->response->cookies в конце Root, и вы должны быть в порядке.

JayK

...