Cookie im laufenden Skript setzen
mickmack
- cgi
0 Cheatah0 Sönke Tesch
Hallo zusammen,
ich habe folgendes Problem:
Und zwar möchte ich einen Cookie setzen über folgende Prozedur:
sub intern_set_cookie_startzeit
{
use strict;
my ($cookie_zeit,$datum)=@_;
my $cookie;
$cookie_zeit.="~".$datum;
$cookie= cookie(-name=>'startzeit',
-value=>$cookie_zeit ,
-expires=>'+3M',
-path=>'/');
print header(-cookie => $cookie );
Das klappt auch wunderbar. Allerdings nur, wenn ich vorher den Befehl PRINT im Hauptprogramm noch nicht benutzt habe. Ansonsten wird der Header "set-cookie..." wortwörtlich auf dem Bildschirm ausgegeben.
Ich möchte nun aber einen Cookie setzen nachdem ich bereits etwas über Print ausgegeben habe.
Was mache ich falsch? Worauf muss ich achten?
Hi,
print header(-cookie => $cookie );
Das klappt auch wunderbar. Allerdings nur, wenn ich vorher den Befehl PRINT im Hauptprogramm noch nicht benutzt habe.
ein Header wird _immer_ ganz am Anfang gesendet. Sowie das erste Nicht-Header-Byte geschrieben wurde, ist der Header de facto beendet.
Ich möchte nun aber einen Cookie setzen nachdem ich bereits etwas über Print ausgegeben habe.
Klassischer Konzeptfehler.
Was mache ich falsch?
Du versuchst einen Header auszugeben, nachdem Du bereits Body-Daten ausgegeben hast.
Cheatah
Das klappt auch wunderbar. Allerdings nur, wenn ich vorher den Befehl PRINT im Hauptprogramm noch nicht benutzt habe. Ansonsten wird der Header "set-cookie..." wortwörtlich auf dem Bildschirm ausgegeben.
Was mache ich falsch? Worauf muss ich achten?
Eine HTTP-Antwort besteht in der Regel aus zwei Teilen: Dem Kopf ("header") und nachfolgend den eigentlichen Daten ("body"). Im Kopf werden Zusatzinformationen übertragen, zum Beispiel der MIME-Typ der übertragenen Daten, ihre letzte Änderungszeit oder eben auch Cookiedaten.
Da der Kopf _vor_ dem Körper übertragen wird, müssen auch die Cookiedaten _vor_ dem Körper gesendet werden. Wenn Du nun bereits Körperdaten gesendet hast, ist der Kopf schon raus und Du kannst keinen Cookie mehr setzen.
Entweder Du bringst es fertig und setzt Deinen Keks tatsächlich irgendwie vor allen anderen Ausgaben oder Du mußt Dich auf die Suche nach einem Cache-Mechanismus machen, so daß normale Ausgaben zwischengespeichert werden.
Gruß,
soenk.e