AJAX und Sessions

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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.

    Quellcode

    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. }
    Alles anzeigen

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

    Quellcode

    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>
    Alles anzeigen


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

    Quellcode

    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/…1a81e055322982f936606fc3e

    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.

    Quellcode

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


    In meinem Beispiel sieht das Ergebnis so aus:

    Quellcode

    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.

    Quellcode

    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.
    Bilder
    • firefox-disable-cookies.png

      11,79 kB, 559×277, 1.158 mal angesehen

    13.936 mal gelesen