Dieter Raber: Cookies von PHP nach Javascript

Hallo,

Ich habe fuer eine kleine Javascript-Bibliothek versucht, $_GET und $_COOKIE aus PHP in Javascript nachzubilden. Das funktioniert auch ganz gut, allerdings ist mir etwas Merkwuerdiges aufgefallen.
Erstmal die JavaScript-Funktion:

var _COOKIE = new Array()
function listenToCookie()
{
  if(document.cookie)
  {
    var cookieArr = document.cookie.indexOf(';') > -1
                  ? document.cookie.split(';')
                  : new Array(document.cookie,'');
    for(var i = 0; i < cookieArr.length; i++)
    {
      pairSplit = cookieArr[i].indexOf('=')
                ? cookieArr[i].split('=')
                : new Array(cookieArr[i],'');
      _COOKIE[pairSplit[0]] = pairSplit[1];
    }
  }
}
listenToCookie();

_COOKIE ist also aehnlich wie bei PHP global und immer vorhanden, zumindest im Lesezugriff.
Ich schreibe jetzt mit PHP ein Cookie, das Beispiel ist aus dem Manual, aber erweitert durch ein zweites Cookie namens 'foo':

setcookie ("foo", 'bar');
$value = 'something from somewhere';
setcookie ("TestCookie", $value);
setcookie ("TestCookie", $value,time()+3600);  /* expire in 1 hour */
setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".example.com", 1);

_COOKIE enhaelt jetzt:
     [foo]        => bar
und  [TestCookie] => something+from+somewhere

Der Wert des Cookies 'TestCookie' enthaelt jetzt anstelle der Leerzeichen Pluszeichen, ganz so, als waere er mit einer Variante von urlencode() behandelt. Ich habe versucht, diese mit den verschiedenen JS-Funktionen zum Decoden loszuwerden, aber ohne Erfolg.

Hat jemand einen Vorschlag?

Gruß,

Dieter

  1. hi,

    und  [TestCookie] => something+from+somewhere

    Der Wert des Cookies 'TestCookie' enthaelt jetzt anstelle der Leerzeichen Pluszeichen, ganz so, als waere er mit einer Variante von urlencode() behandelt. Ich habe versucht, diese mit den verschiedenen JS-Funktionen zum Decoden loszuwerden, aber ohne Erfolg.

    wie und mit welchen genau?

    Hat jemand einen Vorschlag?

    na ja, es gäbe ja auch noch die möglichkeit, einen cookie ohne URL-kodierung des inhaltes zu setzen.
    ob das allerdings bei vorkommen von sonderzeichen noch zuverlässig funktioniert, weiß ich nicht zu sagen.
    eventuell könntest du diese methode ein cookie zu setzen mit rawurlencode() kombinieren - das kodiert leerzeichen, im gegensatz zu urlencode(), nämlich als %20, und das lässt sich mit den JS-funktionen evtl. besser wieder zurückwandeln.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Hallo wahsaga,

      mit den verschiedenen JS-Funktionen zum Decoden loszuwerden

      wie und mit welchen genau?

      Soweit ich weiss, gibt es:
       decodeURI()
       decodeURIComponent()
       unescape()
      Keine davon erfuellt den Zweck

      Die raw-Funktionen hatte ich auch schon im Blick, insbesondere, weil, wie Du schon richtig sagst, man ein %Hex relativ leicht los wird. Das Problem ist halt mehr, dass wenn man solche Funktionen eine Zeitlang in der Schublade hat, man seine eigene Doku nicht mehr liest und schlampig wird. Ich hatte, auch in meinem eigenen Interesse, an eine idiotensichere Loesung gedacht.

      Gruß,

      Dieter

      1. hi,

        Die raw-Funktionen hatte ich auch schon im Blick, insbesondere, weil, wie Du schon richtig sagst, man ein %Hex relativ leicht los wird. Das Problem ist halt mehr, dass wenn man solche Funktionen eine Zeitlang in der Schublade hat, man seine eigene Doku nicht mehr liest und schlampig wird. Ich hatte, auch in meinem eigenen Interesse, an eine idiotensichere Loesung gedacht.

        nun ja, du könntest ja auch in JS selber vorher einmal replace() drüber jagen, um + durch %20 zu ersetzen. (dabei dran denken + als regex-sonderzeichen zu maskieren.)

        und damit der "sinn" des ganzen nicht in irgendeiner doku verschimmelt, die eh keiner mehr liest, könntest du es ja auch inline dokumentieren.
        um's _noch_ "idiotensicherer" zu machen, fällt mit an der stelle leider spontan nichts ein.

        gruß,
        wahsaga

        --
        "Look, that's why there's rules, understand? So that you _think_ before you break 'em."