Cookies funktioniert mit Win und Linux, aber nicht unter Mac OS
Mario Donick
- javascript
0 wahsaga0 Mario Donick0 Mario Donick0 wahsaga
Hallo,
ich habe vor kurzem ein Problem festgestellt. Ich betreibe eine Webseite, die einen internen Bereich für bestimmte Nutzer bereithält. Um sich dort anzumelden, benutze ich eine Mischung aus PHP und Javascript. Das funktioniert unter Windows und Linux mit allen gängigen Browsern, aber zu meinem Erstauen unter Mac OS nicht. Die Lösung ist folgendermaßen aufgebaut.
1. Es gibt im Navigationsframe einen Link "Interner Bereich"
2. Klickt man dort rauf, wird schon der interne Navigationsbereich aufgerufen (Datei "quicknav-i.html"), in dem zu Beginn folgendes Script ausgeführt wird:
<script type="text/javascript">
<!--
if (!(document.cookie=="robin"))
{
parent.quicknav.location.href="../html/quicknav-l.html";
}
-->
</script>
Wie zu sehen, erfolgt eine Weiterleitung zur Datei "quicknav-l.html", wenn das Cookie nicht "robin" ist. Dort ist dann das Login-Formular. Ansonsten erscheint das Menü des internen Bereichs und alles ist gut.
3. Das Loginformular ruft ein PHP-Script "login.php" aus. Wenn die Logindaten korrekt sind, passiert ungefähr folgendes:
if ($LoginOK==true)
{
print "<script type=".chr(34)."text/javascript".chr(34).">\n";
print "<!--\n";
print "document.cookie=".chr(34)."robin".chr(34).";\n";
print "-->\n";
print "</script>\n\n";
print "Sie wurden erfolgreich angemeldet.<br>\n<br>\n";
print "<a href=".chr(34)."quicknav-i.html".chr(34)." target=".chr(34)."_top".chr(34).">weiter</a>\n";
}
else
{
print "Login fehlgeschlagen<br>\n<br>\n";
print "<a href=".chr(34)."quicknav-l.html".chr(34)." class=".chr(34)."drucken".chr(34).">weiter</a>\n";
}
Das PHP-Script generiert eine Seite, in der bei korrektem Login wieder JavaScript-Code steht, und dieser JavaScript-Code setzt das Cookie "robin". Der Link "weiter" führt dann wieder zu "quicknav-i.html", wo das Auswerten des Cookies diesmal Erfolg hat. Bei falschem Login wird zurück zum Anmeldeformular geleitet.
So... Wie gesagt funktioniert diese Methode mit Internet Explorer, Mozilla/Firefox/Netscape, Konqueror und diversen Linux-Textbrowsern, aber nicht unter Mac OS, sowohl mit Safari als auch dem dortigen IE.
Woran liegt das? Was mache ich falsch?
Grüße,
Mario
hi,
Das PHP-Script generiert eine Seite, in der bei korrektem Login wieder JavaScript-Code steht, und dieser JavaScript-Code setzt das Cookie "robin".
gibt's einen grund, warum du das cookie setzen per javascript erledigen lässt - anstatt des direkt vom PHP-script aus zu setzen?
print "document.cookie=".chr(34)."robin".chr(34).";\n";
ein cookie sollte m.E. mindestens aus einem name=wert-paar bestehen - du gibst hier aber ausschließlich einen namen an.
selbst wenn du den wert leer lassen willst - das gleichheitszeichen würde ich beim setzen aber trotzdem verwenden.
if (!(document.cookie=="robin")) {
parent.quicknav.location.href="../html/quicknav-l.html";
sicher, dass document.cookie immer _ausschließlich_ den text "robin" enthält ...? (mal geprüft, alert o.ä.?)
Wie zu sehen, erfolgt eine Weiterleitung zur Datei "quicknav-l.html", wenn das Cookie nicht "robin" ist. Dort ist dann das Login-Formular. Ansonsten erscheint das Menü des internen Bereichs und alles ist gut.
noch mal die frage: warum javascript für diese funktionalität?
das "weiterleiten" könnte man doch genauso gut serverseitig machen - in abhängigkeit davon, ob der client im request den cookie mitschickt oder nicht.
So... Wie gesagt funktioniert diese Methode mit Internet Explorer, Mozilla/Firefox/Netscape, Konqueror und diversen Linux-Textbrowsern, aber nicht unter Mac OS, sowohl mit Safari als auch dem dortigen IE.
könnte mir das nicht vorhandene gleichheitszeichen beim setzen als ursache vorstellen; und ob die abfrage auf exakte gleichheit in ordnung ist, wage ich auch zu bezweifeln.
insgesamt würde ich dir raten, die gesamte funktionalität von PHP erledigen zu lassen; auf javascript kann hier m.E. problemlos verzichtet werden.
gruß,
wahsaga
Hallo wahsaga,
danke für deine Antwort.
Ich werde erstmal versuchen, ob es mit
document.cookie="robin=ok";
besser geht (falls das überhaupt richtig ist). Allerdings hatte ich - wenn ich mich recht erinnere - damals nicht kapiert, wie man mit JavaScript den Wert des Cookies zuweist bzw. ausliest. Ich habe immer nach einem Objekt für den Wert gesucht, irgendwas wie document.cookie.value oder so. Weil ich das nicht fand, ließ ich den Wert leer.
Warum überhaupt JavaScript...? Weil ich PHP EIGENTLICH nur dann benutzen will, wenn es absolut unabdingbar ist. Was mit JavaScript geht, mache ich auch damit. Ich kann sicher mal drüber nachdenken, ob ich diesen Grundsatz aufgebe.
Grüße,
Mario
Nochmal ich. Ich weiß nun, wieso ich das mit PHP nicht konnte. Ich habe dort einfach die Funktion
setcookie("robin","ok")
benutzt. Welche aber folgenden Fehler erzeugt:
Warning: Cannot modify header information - headers already sent
Daher JavaScript...
hi,
Warum überhaupt JavaScript...? Weil ich PHP EIGENTLICH nur dann benutzen will, wenn es absolut unabdingbar ist.
normalerweise solltest du aber andersherum vorgehen.
javascript kann der client deaktiviert haben oder gar nicht unterstützen - damit wäre die komplette funkiionalität hinfällig.
PHP läuft hingegen serverseitig - also braucht der client das nicht untersützen, was du damit machst, funktioniert "überall". (mal abgesehen davon, dass der client evtl. keines cookies akzeptiert.)
Ich weiß nun, wieso ich das mit PHP nicht konnte. [...]
Warning: Cannot modify header information - headers already sent
setccokie löst einen HTTP header aus, und das geht in PHP per default nur dann, wenn noch _keinerlei_ ausgabe an den client erzeugt wurde.
wenn du also die verarbeitung der daten von der ausgabe sauber trennst, kannst du dein cookie auch mit PHP problemlos setzen.
gruß,
wahsaga
Hallo wahsaga,
normalerweise solltest du aber andersherum vorgehen.
Hmm. Klingt eigentlich logisch. Ich werde das jetzt erstmal "so" zum Laufen bringen und dann im nächsten regulären Update auf PHP umstellen.
wenn du also die verarbeitung der daten von der ausgabe sauber trennst, kannst du dein cookie auch mit PHP problemlos setzen.
Okay... Ich konnte die Bedeutung der Fehlermeldung bisher nicht einordnen, dank dir kann ich das nun. Wenn ich den Cookie also setze, bevor ich Ausgaben machen, sollte es gehen.
Dank dir.
Mario