AJAX und Sessions

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Häufig taucht die Frage auf, wie man das bestehende AJAX Script angepasst werden muss, damit Sessions funktionieren. Hier wird auch der Fall behandelt, dass Cookies beim Client deaktiviert sind.

    Kurzer Test - Erfolg?

    Wir testen das ganze indem wir eine SESSION Variable von der Hauptdatei an den AJAX Call übergeben werden. Dazu benutzen wir die bekannte ajaxPost Funktion.

    Source Code

    1. function ajaxPost(url, postData, callback) {
    2. var req;
    3. try {
    4. req = window.XMLHttpRequest ? new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP");
    5. } catch (e) {
    6. // browser does not have ajax support
    7. }
    8. req.onreadystatechange = function() {
    9. if (req.readyState == 4 && req.status == 200) {
    10. callback = document.getElementById(callback);
    11. callback.innerHTML = req.responseText;
    12. }
    13. };
    14. req.open('POST', url, true);
    15. req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    16. req.send(postData);
    17. return false;
    18. }
    Display All

    ... und wir erstellen das Beispiel: Statische und dynamische Inhalte sollten beim Aufruf den selben Inhalt zeigen.

    Source Code

    1. <?php
    2. session_start();
    3. $_SESSION['url'] = 'http://www.easy-coding.de';
    4. ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    5. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de">
    6. <head>
    7. <title>Session Test</title>
    8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    9. <script type="text/javascript" src="ajax.js"></script>
    10. </head>
    11. <body onload="ajaxPost('session.php','','ajaxResponse')">
    12. <h3>Static</h3>
    13. <?php print_r($_SESSION); ?>
    14. <h3>Dynamic</h3>
    15. <div id="ajaxResponse"></div>
    16. </body>
    17. </html>
    Display All


    Die aufgerufene session.php startet einfach nur eine Session und gibt den Inhalt der $_SESSION Superglobalen zurück

    Source Code

    1. <?php
    2. session_start();
    3. print_r($_SESSION);
    4. ?>


    Deaktivierte Cookies?

    Werden Cookies vom Browser abgelehnt erschwert sich die Abfrage. Um das Verhalten zu testen wird der Firefox Browser so konfiguriert, dass er keine Cookies annimmt.
    easy-coding.de/Attachment/505/…1d790292454258c1de42c631a

    Rufen wir das Beispiel nun auf sehen wir, dass das dynamische Array keine Daten liefert.
    Die einzige Möglichkeit die Session über mehrere GET Requests aufrecht zu erhalten ist es die SESSION ID per URL zu übergeben.

    Dazu nutzen wir die Konstante "SID", um den den aktuellen Namen und die Session-ID als Zeichenkette passend zum Anhängen an URLs zu erhalten. Sind Sessions im Browser akzeptiert ist die Konstante leer und wir müssen nichts manipulieren.

    Weil AJAX über JavaScript funktioniert speichern wir uns diesen String in einer globalen JavaScript Variablen.

    Source Code

    1. <script type="text/javascript"> //<![CDATA[
    2. var SID = '<?php echo SID?>';
    3. //]]>
    4. </script>


    In meinem Beispiel sieht das Ergebnis so aus:

    Source Code

    1. <script type="text/javascript"> //<![CDATA[
    2. var SID = 'PHPSESSID=337fb9a607abacaf86f7dba4f1b003fa';
    3. //]]>
    4. </script>


    Diesen String müssen wir nun innerhalb der ajaxPost Funktion an die URL anhängen. Um möglichst flexibel zu bleiben fragen wir die URL ab und prüfen ob schon andere GET Parameter gesetzt wurden. In dem Fall hängen wir den String mit einem ''&" hinten an. Andernfalls müssen wir die Session ID als ersten GET Parameter mit einem Fragezeichen kennzeichnen.

    Source Code

    1. if(typeof SID != 'undefined') url += (url.indexOf('?')>0 ? '&' : '?') + SID;
    2. req.open('POST', url, true);


    Demo

    Die fertigen Dateien finden Sie unter demo.easy-coding.de/ajax/sessions/download.zip.
    Die beiden Beispiele können Sie online nachvollziehen. Einfach ohne Korrektur und weiter mit Korrektur.
    Images
    • firefox-disable-cookies.png

      11.79 kB, 559×277, viewed 602 times

    10,415 times viewed