2009-07-24 3 views
3

Ich verwende Sitzungen in meiner Catalyst App über Session, Session::Store::DBIC und Session::State::Cookie.Wie kann ich keinen Cookie senden, wenn ich den Cache-Control-Header in Catalyst verwende?

Ich habe ein paar Controller und Methoden, die Daten senden, mit einem Cache-Control: public Header, so dass sie wichtig, dass der Set-Cookie: Kopf nicht mit den Antworten gehen (sonst würde es an anderen Clients im Cache gespeichert und gesendet werden, was zu möglichen Sicherheitsproblemen). Ich habe keinen guten Weg gefunden, dies zu erreichen.

Wie kann ich Session oder Session::State::Cookie sagen, dass kein Cookie als Reaktion auf eine bestimmte Anfrage gesendet wird?

Antwort

1

ein wenig RTFS tun, Session.pm überschreibt Catalyst finalize_headers Methode und setzt das Cookie gibt, durch eine ziemlich tiefe Verbindungskette:

finalize_header 
⇒ _save_session_expires 
⇒ session_expires 
⇒ _extended_session_expires 
⇒ extend_session_id (…::Session::State::Cookie) 
⇒ update_session_cookie (…::Session::State::Cookie) 

Es scheint keinen Weg, um Flagge zu sein alles in der Kette zu Stop. Die einzige Überprüfung ist eine Methode in Cookie.pm namens cookie_is_rejecting, die nur den konfigurierten Cookie-Pfad zu der Anfragepfad vergleicht.

Es sieht also so aus, als ob ich meine eigene Überschreibung zu entweder update_session_cookie oder cookie_is_rejecting hinzufügen könnte. Ich denke, ich werde cookie_is_rejecting verwenden.

Hier ist der Code, den ich schließlich verwendet habe. Beachten Sie, dass dies eher klugy ist, aber es funktioniert ...

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

Es scheint ein bisschen ungewöhnlich, es auf diese Weise zu nähern, aber ich denke, ich verstehe, was Sie tun.

Wenn ich mich richtig erinnere, setzt das Cookie-Staat Modul einfach das Cookie in der Antwort Objekt:

$c->response->cookies 

Ich glaube nicht, es gibt es keine Magie, und es setzt es nur um die Sitzung zu erstellen oder erweitern Zeit. Wenn Sie sicherstellen möchten, dass keine Cookies gesendet werden. Löschen Sie $c->response->cookies in Root-Ende und Sie sollten gut gehen.

JayK

+0

Wenn es einen besseren/üblicheren Weg gibt, sich diesem zu nähern, würde ich es gerne hören. Dies ist meine erste echte Catalyst-App, also kann ich Dinge ohne jeden Grund auf alberne Weise tun. – derobert

+0

'$ c-> log-> debug (" Cookies sind: ". Pp ($ c-> response-> cookies));' in meinem root-Ende protokolliert Cookies als ein leerer Hash bereits, und doch Set-Cookie ist wird sowieso gesendet. – derobert

+0

[info] *** Anfrage 9 (1.125/s) [10894] [Mo Jul 27 11:20:48 2009] *** [debug] "GET" Anfrage für "js/tools/e3f84575109c4612819ae19e28973135" von "172.16 .1.241" [Debug] Pfad ist "js Tools/e3f84575109c4612819ae19e28973135 " [Debug] gefunden sessionid "f356a9509668ea25f70b6b8dd2edef318dad95a1" in Cookie [Debug] Restauriert Sitzung "f356a9509668ea25f70b6b8dd2edef318dad95a1"" [Debug] Argumente sind" [Debug] Cookies sind: {} [debug] Rendering-Vorlage "js/tools.js" [debug] Übergeben der Seite als Text: js/tools.js [info] Request nahm 0,110160s (9.078/s) – derobert