Ajax

Moin moin,
ich habe ajax bisher immer ein wenig stiefmütterlich behandelt, und mir, wenn ich ehrlich bin nicht immer so den kopf darum gemacht.

Bisher habe ich die ajax funtion in meinem Layout mit integriert via
dojo.xhrGet() mit den entsprechenden Parametern.

Keine Token Abfrage, keine security Id usw.

Da ich mit dem Zend Framework arbeite, und meine ViewHelper mir einiges abnehmen habe ich auf seitens des Frameworks nicht soviel zu tun.
Prinzipielle Abfrage:
-bist du ajax,
-ja/nein
-mache das, oder dieses

Da die Controllers, sowie deren Action mit in das Rolle, Rechte System integriert sind, sollte ein unerlaubter Aufruf von aussen "nicht" möglich sein.
( "nicht" mit doppelten Anführungszeichen )

Mich würde mal interessieren, wie Ihr Ajax in euer System MVC/Hompage oder ähnlichen integriert?
Wo packt Ihr welche Function wie rein?
Wie sehen die entsprechenden Funtionen bei Euch aus?
Sollte ich die Ajax funktionalität global in minem system zur Verfügung stellen, oder nur den Seiten bereitstellen, die ajax auch wirklich nutzen ?

Ich weis Fragen über Fragen !!! Sry ...:rolleyes:

Im Web gibt es viele Tutorials, jedoch immer absolute Basics.
Zumindestens habe ich nocht nichts besseres gefunden ...

Merci so far
 
Grundsätzlich möchte ich sagen, dass AJAX meines Erachtens sowieso ständig missverstanden wird.
Anstatt hier von ach-so-tollen Akronymen zu reden, sollten wir AJAX als ganz normaler Request eines Browsers an einen Server betrachten. (Was es übrigens auch ist)
Unterschied? Es wird ein zusätzlicher Header mitgesendet.

Code:
HTTP_X_REQUESTED_WITH
So, nun du fragst die folgenden Dinge:

Mich würde mal interessieren, wie Ihr Ajax in euer System MVC/Hompage oder ähnlichen integriert?
Ich benutze für alle meine Projekte das JavaScript-Framework jQuery, welches eine breite Funktionalität hinsichtlich AJAX aufweist. Das "AJAX" bezieht sich in deiner Frage wahrscheinlich auf die eigentliche Abfrage. Diese wird in ein separates JavaScript-File gepappt und ausgeführt, wenn requested.

Wo packt Ihr welche Function wie rein?
Wie bereits gesagt stellt AJAX eine alternative Request-Methode zum Server dar. Du kannst sie aber einfach als Zugriff sehen. Darum werden die URL's, welche von AJAX-Funktionen aufgerufen werden immer auch stinknormale Methoden in meinen Controllern sein. Somit ist die vollständige Einbettung in ein Framework bereits gewährleistet (ohne Aufwand, nota bene)!

Wie sehen die entsprechenden Funtionen bei Euch aus?
Wie bereits gesagt. Es sind normale Methoden auf deinem Controller. Der einzige Unterschied sind die Rückgabeparameter. Ich habe mir hier die sogenannte JSON-Notation angewöhnt. Von mir aus gesehen die einfachste Form Daten zwischen Serverapplikation und Javascript auszutauschen. Folglich könnte eine solche Funktion bei mir so aussehen.

Serverseitig (am Beispiel mit dem Framework FuelPHP)
Code:
<?php

// ...
public function action_getinfo()
{
    // RFC4627
    $this->response->set_header('Content-Type: application/json');

    // get data from $_GET array (sanitized)
    $id = Input::get('id');

    // do something and set output
    // $this->isvalid returns a boolean
    $this->response->body = json_encode(array('success' => $this->isvalid($id));
}

//...
Clientseitig (am Beispiel mit dem Framework jQuery)
Code:
$(document).ready(function()
{
    // add click handler
    $('button#checkid').click(function()
    {
        // save button
        me = $(this);
        
        // url is routed by fuelphp
        $.getJSON('controller/getinfo', { id: me.data('id') }, function(response)
        {
            if(response.success)
            {
                me.html('valid id');
            }
            else
            {
                me.html('invalid id');
            }
        });
    });
});
Code:
<!DOCTYPE html>
<html>
<body>
    <button id="checkid" data-id="11" value="click me!" />
</body>
</html>
Textuelle Ergänzungen: In FuelPHP werden Methodennamen, welche aufgerufen werden können, immer mit action_ präfixt. Wie du siehst überprüfe ich nicht, ob die URL wirklich per AJAX aufgerufen wird. Interessiert mich eigentlich auch gar nicht.

Sollte ich die Ajax funktionalität global in minem system zur Verfügung stellen, oder nur den Seiten bereitstellen, die ajax auch wirklich nutzen ?
Ich verstehe die Frage nicht. Meinst du, ob du ein JavaScript-Framework nur einbindest, wenn du es auch brauchst? Grundsätzlich eine gute Idee, wenn da nicht der ständige Verwaltungsaufwänd wäre: nämlich zu entscheiden ob du es denn auch brauchst. Des weiteren werden solche Files auf dem Client gecached, weshalb ein Client es sich sowieso nur einmal ziehen muss. Oder du verwendest gleich einen CDN wie Google (oder einer der Wahl :))

Im Web gibt es viele Tutorials, jedoch immer absolute Basics.
AJAX ist auch nicht mehr als Basic. Keine Magie. Kein Vodoo. Nur JavaScript. =)

Keine Token Abfrage, keine security Id usw.
Diesen Punkt verstehe ich gar nicht. Du verwendest offenbar ein Framework (Zend, mhh?) welches eine Implementation einer Tokensecurity mit sich bringt. Wieso denn nicht einfach verwenden? Ich verwende in jeder Form einen CSRF-Token, welcher serverseitig automatisch ausgewertet wird.

Abschliessend kann ich wohl sagen: Mach dir keinen Stress um AJAX. Verwende es, wenn du es brauchst und sonst eben nicht. Aber wenn du es verwendest, dann natürlich immer im Kontext deines serverseitigen Frameworks.
 
Zuletzt bearbeitet:
Moin moin,
danke für die verständliche Antwort.
Zitat:
Keine Token Abfrage, keine security Id usw.
Diesen Punkt verstehe ich gar nicht. Du verwendest offenbar ein Framework (Zend, mhh?) welches eine Implementation einer Tokensecurity mit sich bringt. Wieso denn nicht einfach verwenden? Ich verwende in jeder Form einen CSRF-Token, welcher serverseitig automatisch ausgewertet wird.
Das ist schon richtig, nur hat Zend keine Tokenprinzip für Ajax und CSRF.
Lediglich nur das Zen_Form_Element_Hash, welches ich auch einsetze.

Aber nach Deinen Beschreibungen setze ich es dann doch schon entsprechend ein nur halt mit Dojo...

thx:thumb_up:
 
np. Btw: Hier wird das Prinzip des Zen_Form_Element_Hash folgendermassen erklärt:

Dieses Element bietet Schutz vor CSRF Attacken auf Forms, und stellt sicher das die Daten die übertragen werden von der Benutzersession stammen welche die Form erstellt hat und nicht durch ein bösartiges Skript. Sicherheit wird ermöglicht durch das hinzufügen eines Hash Elements zur form und dessen Prüfung wenn die Form übermittelt wird.
 
Genau, ist auch so verstanden und wird auch so genutzt.
Deswegen will ich auch nach dem Prinzip einen Javascript Token anlegen...

1. Die form wird normal aufgerufen
- Zend_Form_Element_Hash erzeugt alles selber (sprich key, ablage in session und soweiter)
2. Parallel hierzu einen separaten key erzeugen und ebenfalls in die session ablegen. Den selbigen Key in eine variable z.B. var security_token in die view schreiben und mit rendern.
3. wenn ein ajaxrequest abgefeuert und in der action als isXmlHttpRequest() erkannt wird, den security_token auslesen und gegen den abgelegten key in der session prüfen.
Nur wenn dieser stimmt wird der rest abgearbeitet, sonst nicht.

Oder macht das ganze keinen Sinn?
 
Hmm geht so =P
Wofür brauchst du Clientseitig einen im JavaScript verfügbaren Security Token? Stell dir vor, du renderst ganz normal deine Form, schickst alle Formdaten per AJAX ab (auf ein Forumlar bezogen) und hast somit natürlich ebenfalls einen Security Token abgeschickt (sofern zur Form hinzugefügt).

Wenn ich dich richtig verstehe wäre die Antwort auf deine Frage am besten mit einem kurzen Codeschnipsel zu erklären:

Code:
$(document).ready(function()
{
    $('form').submit(function()
    {
        var form = $(this);
        
        $.ajax(
        {
            type: 'POST',
            url:  'controller/method',
            
            // statt hier alle daten separat zusammenzusammeln einfach alle
            // formdaten mitschicken, folglich auch dein Zend_Form_Element_Hash
            data: form.serialize(),
        });
    });
});

Ich kenne das Zend-Framework gar nicht, aber bei FuelPHP zum Beispiel, läuft das ganze direkt über die integrierte Validation. Also hab ich als Entwickler sowieso nichts zu tun.

Also als Vorschlag: Zend_Form dahingehend erweitern, als dass vor dem rendern immer ein Zend_Form_Element_Hash hinzugefügt wird und du brauchst dich um nichts mehr zu kümmern. :)
 
Ok. jetzt jetzt bin ich bei Dir...

Du denkst ich will immer die komplette form via ajax absetzten und dann gegen einen selbstdefinierten security_token prüfen.

Dann habe ich mich wohl im Verlauf unverständlich ausgedrückt.

Am Beispiel Captcha:

Wie üblich hat man ein captcha image welches schwer zu lesen ist. Also klicke ich auf "Grafik neu laden" und ein Ajax reqeust wird abgesetzt, was mir das image neu liefert.
Um hier zu gewährleisten das die Anfrage auch von dem Besitzer der Session ist, wollte ich hier mit einem security_token javascriptseitig arbeiten ...

Kam das jetzt verständlicher rüber?
 
Zurück
Oben