Es müssen nicht immer Clientvariablen bei der CF-Programmierung sein, Cookies
können manchmal eine gute Alternative sein. Zwar benutzen Clientvariablen (wenn
mit Cookies eingestellt) auch Cookies, was aber für den Programmierer weitgehend
transparent bleibt.
Hat aber der User die Cookie-Warnung in seinem Browser eingestellt, öffnen sich
gleich zu Beginn des Site-Besuches bei der Benutzung von Clientvariablen nacheinander
2 Popupfenster (für CFID und CFTOKEN) , was den User sicher nicht erfreut und
keinen guten Eindruck hinterlässt. Cookies arbeiten hier etwas userfreundlicher,
denn man kann selbst festlegen, wann der Cookie gesetzt werden soll. Hat man
z. B. ein Warenkorbsystem muss man ja nicht gleich den User verschrecken und
schon auf der Startseite den Cookie setzen. Wenn er etwas in den Warenkorb legen
will und dann erst kommt das Popup-Fenster weis der User wenigstens, warum das
Cookie kommt.
Ein weiterer Vorteil
von Wertespeicherung in Cookies anstatt in Clientvariablen besteht darin, dass
die Informationen komplett auf dem Userrechner liegen. Bei der Benutzung von
Clientvariablen werden nur CFTOKEN und CFID auf dem Client gespeichert, die
zugehörigen Variablenwerte auf dem Server z. B. in der Registry oder einer
Datenbank. Bei Websites mit starkem Zugriff hat man schnell eine riesige Menge
von Clientvariablen und der Systemadministrator wird sich bedanken, wenn man
ihn seine Registry mit Clientvariablen vollpumpt.
Die Werte des Cookies sollten ausserdem mit der Encrypt()-Funktion verschlüsselt
werden. Kein User freut sich, wenn er auf der Festplatte Dinge wie passwort="blaa"
oder KundenNr="233" findet :-) (Cookies liegen als unverschlüsselte
Dateien auf der Festplatte!).
Bei Abfrage eines
Cookies sollte man nie vergessen, die Existenz mit den CF-Methoden (z. B. isDefined()
oder CFPARAM) vor Abfrage zu testen. Sollte der User Cookies in seinem Browser
deaktiviert haben, wird der gesetzte Cookie nicht da sein.
Der User kann eine Seite, die nur mit Cookies zugänglich ist, in seinem Browser
als Bookmark gespeichert haben und der gesetzte Cookie ist ausgelaufen. Auch
dann wäre der Cookie nicht vorhanden.
Cookies werden im HTTP-Header mit dem Browser ausgetauscht. Man sollte deshalb beachten, dass ein Cookie nicht auf der selben Seite abgefragt werden kann, auf der er erst gesetzt wurde. Ein Cookie muss erst zum Browser gesendet werden und der Browser kann ihn dann erst im nächsten Request mitsenden. Deshalb ist der Cookie auch erst auf der nächsten Seite vorhanden.
Weitere Dinge gibt es bei der Benutzung von CFLOCATION und Cookies zu beachten. Bei einem CFLOCATION-Tag wird der Browser angewiesen, eine neue Seite zu laden. Dabei wird der eben mitgesandte HTTP-Header verworfen. Ein mitgesandter Cookie wird also nicht vom Browser gespeichert und ist deshalb auf der nächsten Seite nicht vorhanden. Das ist kein Bug in ColdFusion sondern ein Bug im Webprotokoll (oder Feature, wie man es sehen will). Sollte man das Setzen eines Cookies vor dem CFLOCATION benötigen muss man einen Reload im Browser mit Javascript oder META-Tags erzeugen, etwas so:
<CFHTMLHEAD
TEXT="<script language='JavaScript'>
self.location.replace('seite.cfm');
</script>"
>
Der komplette Code sieht folgendermassen aus:
seite1.cfm soll einen Cookie setzen und auf seite2.cfm umleiten. In seite2.cfm soll der Cookie abgefragt werden. Zuerst der Code mit dem CFLOCATION-Tag, der NICHT funktioniert!
seite1.cfm
<body>
<CFIF umleitung is "ja">
<CFCOOKIE name="login" value="ok">
<CFSET newURL="seite2.cfm">
<CFLOCATION url="#newURL#">
</CFIF>
</body>
Auf seite2.cfm
führt die Cookieabfrage ( cookie.login ) nun zu einer Fehlermeldung.
Dieser Code funktioniert:
<body>
<CFIF umleitung is "ja">
<CFCOOKIE name="login" value="ok">
<CFSET newURL="seite2.cfm">
<CFHTMLHEAD TEXT="
<script language='JavaScript'>
self.location.replace('#url#');
</script>
">
</CFIF>
</body>