IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Partage de variable entre fonction


Sujet :

JavaScript

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    1ére réflexion :
    pourquoi ne pas traiter coté serveur la validité de la clef?
    si on envoi null alors après test on en génère une et on la retourne, dans le cas contraire j'informe que c'est OK.
    C'est le cas ! Lors de la première requête, le programme génère la clef et la retourne si tout c'est bien passé. Ensuite une seconde requête ac la clef est envoyé côté serveur qui test si c'est la clef qu'il vient de générer ou pas.

    Citation Envoyé par NoSmoking Voir le message
    2éme réflexion :
    si tu es en asynchrone tu vas avoir intérêt à donner une adresse de retour à ta fonction, car retourner une valeur c'est bien dans le vide c'est moyen. Cela peut être l'appel à une méthode de ton objet qui va elle atteindre ta variable.
    Peux-tu m'expliquer ce que tu entends par adresse de retour ?
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  2. #22
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 961
    Points : 44 133
    Points
    44 133
    Par défaut
    Peux-tu m'expliquer ce que tu entends par adresse de retour ?
    en rapport avec ce qu'a écrit Watilin, apporterCafe(cafePret);.

    ou tu fais tes traitements dans la fonction anonyme, ou il te faut bien retourner le résultat quelque part, car en tout état de cause ta fonction meurt après exécution (ça c'est une évidence ), donc lorsque cette fonction, en asynchrone, se termine qui sait où va atterrir un éventuel return( laclef).
    La mise en place de l'appel à une fonction régle ce problème.

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Bah sans savoir que ça s'appelle comme ça je l'avais fait suite au conseil de Watilin, mais sans succès toujours :/

    Je crois que je n'ai pas d'autre solution, voilà le code complet, dites-moi si quelqu'un trouve quelque chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    var maClass = function(){
        var vid             = null;
        var time            = null;
        var generate        = true;
     
        timeOutTest         = function(nbSecMax){
            return (time!==null && ((Math.round(+new Date()/1000))-time<nbSecMax));
        }
     
        setVid              = function(){
            if(arguments[0]){
                generate    = !generate;
                vid         = (generate===false) ? arguments[0] : null;
            }
     
            return (vid!==null);
        }
     
        sendAjaxRequest     = function(){
            $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"traitement.php",
                type        : "POST",
                data        : "time="+time+"&vid="+vid+"&generate="+generate,
                cache       : false,
                success     : function(valR){
                    if(valR!==0 && valR!==null){
                        setVid(valR);
                    }
                }
            });
     
            return true;
        }
     
        this.generate_vid   = function(){
            var valReturned = false;
     
            if(vid===null && (time===null || false===timeOutTest(30))){
                time = Math.round(+new Date()/1000);
                sendAjaxRequest();
                if(setVid()===true){
                    valReturned = this.generate_vid();
                }
            }
            else{
                sendAjaxRequest();
                valReturned = (setVid()===true) ? vid : false;
            }
     
            return valReturned;
        }
    };
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  4. #24
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    c'est ta façon de concevoir les appels qui est erronée :

    ce que tu veux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    appeler une fonction, 
    	que la fonction fasse une requête au serveur, 
    	attendre la réponse, 
    	retourner la réponse reçue
    en général, "attendre" en javascript comme dans beaucoup de langages, c'est mal car ça bloque l'exécution. même si c'est permis et même conçu pour ("arguments synchrone") je te le déconseille vivement.


    la bonne façon de faire est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    appeler une fonction,
    	que la fonction fasse une requête au serveur, 
    	s'arrêter là pour le moment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    utiliser une autre fonction(callback/success) qui se déclenche lorsque la réponse arrive
    	appeler l'une ou l'autre méthode en fonction de la réponse, du status de la page etc..
    	utiliser la réponse et eventuellement mettre la page à jour.

    oublie donc les valeurs de retour avec ce système, tu peux par contre créer des timers (setTimeout) pour detecter des délais trop long par exemple.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  5. #25
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    en gros tu as qqe chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // mauvaise utilisation avec attente d'un retour d'un appel ajax
    var maVideo = monObjet.generate_vid();
    document.body.appendChild(maVideo); // exemple d'utilisation du retour de ta fonction generate_vid();

    tu dois le changer en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // bonne utilisation d'un appel ajax sans attente
    monObjet.generate_vid();
    et par exemple utiliser ta méthode setVid pour mettre la vidéo dans la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //setVid est déclenché à partir du success de l'appel ajax
    setVid  = function(obj){
        if(obj && generate){
            vid  =  obj; 
            // on utilise donc la valeur de retour ici
            document.body.appendChild( vid );
        }
        return vid;
    }
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  6. #26
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Willpower Voir le message
    c'est ta façon de concevoir les appels qui est erronée :

    ce que tu veux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    appeler une fonction, 
    	que la fonction fasse une requête au serveur, 
    	attendre la réponse, 
    	retourner la réponse reçue
    en général, "attendre" en javascript comme dans beaucoup de langages, c'est mal car ça bloque l'exécution. même si c'est permis et même conçu pour ("arguments synchrone") je te le déconseille vivement.


    la bonne façon de faire est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    appeler une fonction,
    	que la fonction fasse une requête au serveur, 
    	s'arrêter là pour le moment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    utiliser une autre fonction(callback/success) qui se déclenche lorsque la réponse arrive
    	appeler l'une ou l'autre méthode en fonction de la réponse, du status de la page etc..
    	utiliser la réponse et eventuellement mettre la page à jour.

    oublie donc les valeurs de retour avec ce système, tu peux par contre créer des timers (setTimeout) pour detecter des délais trop long par exemple.
    Merci pour ce petit rappelle

    Citation Envoyé par Willpower Voir le message
    en gros tu as qqe chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // mauvaise utilisation avec attente d'un retour d'un appel ajax
    var maVideo = monObjet.generate_vid();
    document.body.appendChild(maVideo); // exemple d'utilisation du retour de ta fonction generate_vid();

    tu dois le changer en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // bonne utilisation d'un appel ajax sans attente
    monObjet.generate_vid();
    et par exemple utiliser ta méthode setVid pour mettre la vidéo dans la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //setVid est déclenché à partir du success de l'appel ajax
    setVid  = function(obj){
        if(obj && generate){
            vid  =  obj; 
            // on utilise donc la valeur de retour ici
            document.body.appendChild( vid );
        }
        return vid;
    }
    Quand tu dis document.body.appendChild( vid );, comment je fais pour récupérer ma valeur "vid" dans mon script après ? Car je dois l'utiliser pour une autre requête d'un autre script. En faite je fais dans mon autre ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $.ajax({
        ...
        data : '...&vid='+monObj.generer_vid(),
        ...
    });
    Donc tu vois, avec ma méthode c'était plus pratique puisque cette requête ajax NE DOIT PAS partir si le vid n'a pas été générer... L'asynchrone me correspondais mieux mais hélas il ne marche pas :/
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  7. #27
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    Quand tu dis document.body.appendChild( vid );, comment je fais pour récupérer ma valeur "vid" dans mon script après ? Car je dois l'utiliser pour une autre requête d'un autre script. En faite je fais dans mon autre ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $.ajax({
        ...
        data : '...&vid='+monObj.generer_vid(),
        ...
    });
    Donc tu vois, avec ma méthode c'était plus pratique puisque cette requête ajax NE DOIT PAS partir si le vid n'a pas été générer... L'asynchrone me correspondais mieux mais hélas il ne marche pas :/
    C'était un exemple d'utilisation, insérer ton résultat dans la page.
    Mais si tu veux faire une seconde requête sur ce résultat, tu n'as qu'à lancer cette seconde requête dans la fonction (success) recevant le premier résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // premier appel ajax
    $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"traitement.php",
                type        : "POST",
                data        : "time="+time+"&vid="+vid+"&generate="+generate,
                cache       : false,
                success     : function(valR){
                    // second appel ajax à partir du résultat du premier.
                    $.ajax({
                       ...
                       data : '...&vid='+monObj.generer_vid(),
                       ...
                   });
                }
            });
    ps:
    synchrone = quand tu attends ta réponse avant de poursuivre.
    asynchrone = quand tu poursuis l'exécution de ton code et qu'une autre fonction se déclenche lors de la réception de la réponse.

    avec jquery, c'est "asynchrone" par défaut et si tu veux "synhcrone", tu dois mettre "async:false".
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  8. #28
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    À mon avis, c'est l'algorithme lui-même qui est à revoir :
    Code algo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FONCTION GENERER{
        SI laClef N'EST PAS GENERER
            laClef = ENVOIE_REQUETTE_AJAX()         (1)
            retour = GENERER();                     (2)
        SINON
            test = ENVOIE_REQUETTE_AJAX(laClef)     (1)
            SI test===VRAI                          (2)
                retour = laCLef;
            SINON
                retour = FAUX;
            FIN SI
        FIN SI
    }                                               (3)
    Sur les points marqués (1), tu ne peux pas utiliser la valeur de retour de ces fonctions car elles retournent immédiatement après l'envoi de leurs requêtes Ajax, et n'ont à ce moment-là pas encore de valeur à renvoyer.

    Sur les points marqués (2), tout le code en orange sera exécuté immédiatement après l'envoi des requêtes Ajax, sans attendre l'arrivée du résultat. Ce code est à placer dans les fonctions de rappel.

    Le point (3) représente la fin de la fonction generer. Comme tu n'as pas encore le résultat des requêtes, tu n'as pas de valeur à renvoyer ici non plus. Autrement dit, la fonction generer ne peut rien renvoyer.

    Ce qu'il te faut, c'est une nouvelle propriété sur ton objet (publique ou non, à toi de voir), qui recevra le résultat quand il sera prêt. Appellons-la resultatPret. Tu auras également une fonction, mettons suiteTraitement, qui sera appelée seulement quand tu seras sûr que le résultat est prêt.

    Voici le nouvel algorithme :
    Code algo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    FONCTION GENERER{
        SI laClef N'EST PAS GENERER
            ENVOIE_REQUETTE_AJAX({
                ...
                success: function( result ) {
                    laClef = result;
                    GENERER();
                }
            })
        SINON
            ENVOIE_REQUETTE_AJAX({
                data: laClef,
                ...
                success: function( result ) {
                    test = result;
                    SI test===VRAI
                        resultatPret = laCLef;
                    SINON
                        resultatPret = FAUX;
                    FIN SI
                    suiteTraitement();
                }
            })
        FIN SI
    }
    Le reste est entre tes mains
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Willpower Voir le message
    C'était un exemple d'utilisation, insérer ton résultat dans la page.
    Mais si tu veux faire une seconde requête sur ce résultat, tu n'as qu'à lancer cette seconde requête dans la fonction (success) recevant le premier résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // premier appel ajax
    $.ajax({
                url         : ((new Error()).fileName.replace(/(^.*)(\/)(.*$)/gi, "$1$2"))+"traitement.php",
                type        : "POST",
                data        : "time="+time+"&vid="+vid+"&generate="+generate,
                cache       : false,
                success     : function(valR){
                    // second appel ajax à partir du résultat du premier.
                    $.ajax({
                       ...
                       data : '...&vid='+monObj.generer_vid(),
                       ...
                   });
                }
            });
    Non car les requêtes sont externes à l'objet, on ne sait pas à ce moment ce qu'elle sera et comment elle sera construite :/

    Citation Envoyé par Willpower Voir le message
    ps:
    synchrone = quand tu attends ta réponse avant de poursuivre.
    asynchrone = quand tu poursuis l'exécution de ton code et qu'une autre fonction se déclenche lors de la réception de la réponse.

    avec jquery, c'est "asynchrone" par défaut et si tu veux "synhcrone", tu dois mettre "async:false".
    Oui autant pour moi, mes mains ont dérrapés :p

    Citation Envoyé par Watilin;6389519

    Ce qu'il te faut, c'est une nouvelle propriété sur ton objet (publique ou non, à toi de voir), qui recevra le résultat quand il sera prêt. Appellons-la [codeinline
    resultatPret[/codeinline]. Tu auras également une fonction, mettons suiteTraitement, qui sera appelée seulement quand tu seras sûr que le résultat est prêt.

    Voici le nouvel algorithme :
    Code algo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    FONCTION GENERER{
        SI laClef N'EST PAS GENERER
            ENVOIE_REQUETTE_AJAX({
                ...
                success: function( result ) {
                    laClef = result;
                    GENERER();
                }
            })
        SINON
            ENVOIE_REQUETTE_AJAX({
                data: laClef,
                ...
                success: function( result ) {
                    test = result;
                    SI test===VRAI
                        resultatPret = laCLef;
                    SINON
                        resultatPret = FAUX;
                    FIN SI
                    suiteTraitement();
                }
            })
        FIN SI
    }
    Le reste est entre tes mains
    C'est justement ce que j’essayai d'éviter... Ré-écrire deux fois le même code à 99%... Mais comment faire ?

    Car après vos nombreuses remarques à tous, je comprends clairement le problème qui se pose : le script n'attends pas ajax et donc les valeur ne sont pas renseignées au bon moment et donc les return sont foirés.

    Bref je suis toujours autant dans le flou car je trouve ça dommage qu'en programmation "objet" (désolé j'en suis à mes début en js) on soit obligé d'aller à l'inverse même des principes fondateurs en matière de ré-utilisabilité...
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  10. #30
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    Bref je suis toujours autant dans le flou car je trouve ça dommage qu'en programmation "objet" (désolé j'en suis à mes début en js) on soit obligé d'aller à l'inverse même des principes fondateurs en matière de ré-utilisabilité...
    non non, le code peut bien être réutilisé, faut juste trouver le code qui te convient mais on a du mal à te proposer le bon car on ne comprend pas la suite logique de ce que tu veux faire avec les réponses ajax.

    si on avait tous les éléments on te proposerai directement une réponse complète, mais je crois comprendre que tu désires garder une partie de ton code "secret" si je ne me trompe ?

    Citation Envoyé par FotoXe33 Voir le message
    Non car les requêtes sont externes à l'objet, on ne sait pas à ce moment ce qu'elle sera et comment elle sera construite :/
    à quel moment sait-on quelles requêtes ou quelles méthodes appliquer à l'objet ? désolé mais pour te proposer la solution complète on a besoin de savoir ce que tu désires faire de tes objets reçus.

    en fait, il faut voir ton code comme du code évènementiel et non séquentiel, mais je conçois que c'est déroutant quand on n'a pas l'habitude.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    C'est même pas le "code" :p Le php marche parfait, les réponses se font comme je le souhaite.

    En faite voilà le "secret" :p

    Je fait une classe made in moi pour protéger les requêtes ajax. Il me faut donc un test php car c'est plus compliqué de faire quelque chose de non hackable avec js :p

    L'idée :

    La personne fait une requête ajax en mettant comme un de ses paramètres une clef unique généré en php et expirant toutes les 30 secondes. Du côté serveur il y a une simple fonction qui permet de vérifier que la clef soit correcte et qu'elle n'est pas expirée. Donc dans l'idée, une personne qui veut protéger sa requête côté client fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var monObj = new maClasse();
     
    $.ajax{
       ...
       data : "toto=tata&vid="+monObj.generer_vid(), // Il faut qu'à ce moment un vid soit générer, tester par php une fois, puis retrouné
       ...
    });
    Mais ça je l'ai déjà expliqué donc je ne vois pas comment expliquer plus :/
    Ce n'est pas parce qu'un chemin prends la direction que l'on souhaite qu'il mène où l'on veut...
    Trouver des inconvénients à Micro$oft, c'est comme faire une division par zéro, c'est infini...

  12. #32
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par FotoXe33 Voir le message
    C'est même pas le "code" :p Le php marche parfait, les réponses se font comme je le souhaite.

    En faite voilà le "secret" :p

    Je fait une classe made in moi pour protéger les requêtes ajax. Il me faut donc un test php car c'est plus compliqué de faire quelque chose de non hackable avec js :p
    Impossible même de faire du nom hackable coté client, il faut toujours revérifier coté serveur.

    Citation Envoyé par FotoXe33 Voir le message
    L'idée :

    La personne fait une requête ajax en mettant comme un de ses paramètres une clef unique généré en php et expirant toutes les 30 secondes. Du côté serveur il y a une simple fonction qui permet de vérifier que la clef soit correcte et qu'elle n'est pas expirée. Donc dans l'idée, une personne qui veut protéger sa requête côté client fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var monObj = new maClasse();
     
    $.ajax{
       ...
       data : "toto=tata&vid="+monObj.generer_vid(), // Il faut qu'à ce moment un vid soit générer, tester par php une fois, puis retrouné
       ...
    });
    Mais ça je l'ai déjà expliqué donc je ne vois pas comment expliquer plus :/

    on avance même si je ne vois toujours pas l'aboutissant, je peux tenter de te proposer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    var key = null;
    var time = 0;
    function generateKey(boolVerify){
    	$.ajax({
    		success:function(response){
    			key = response;
    			time = (new Date()).getTime();
    			if(boolVerify)
    				verifyKey();
    		}
    	});
    }
    function action(key){
    	...
    }
    function error(key){
    	...
    }
    function verifyKey(){
    	if((new Date()).getTime() - 30000 > time)
    		generateKey(true); // true pour forcer la vérification après
    	else{
    		$.ajax({
    			data:"key="+key
    			success:function(response){
    				if(response===true)
    					action(key);
    				else
    					error(key);
    			}
    		});
    	}
    }
     
    // demande une nouvelle "key" qui sera stocké dans la variable key sans callback une fois la réponse reçue.
    generateKey();
     
     
    // exécute "verifyKey" après 5 secondes, si la clé datait de plus de 30 secondes, alors en génére une nouvelle et demande une vérification une fois la clée obtenue. sinon si le temps de 30 secondes n'était pas écoulé, alors fait une requete de vérification au serveur et s'il renvoit "true" déclenche la fonction "action" sinon la fonction "error".
    setTimeout(verifyKey,5000);
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  13. #33
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 961
    Points : 44 133
    Points
    44 133
    Par défaut
    je suis toujours dans la lecture en diagonale

    mais on peut ré-exécuter une fonction à partir d'elle même en utilisation la propriété callee de arguments.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function fctTest( param){
      // get la fonction appelante
      var refFonction = arguments.callee;
      // get argument passe
      var valParam = arguments[0];
      // traitement suivant le cas
      if( valParam){
        alert( 'Le parametre est : ' +valParam);
      }
      else{
        // on la rapelle avec un parametre
        refFonction('Bonjour!');
      }
    }
    // appel sans parametre
    fctTest();

Discussions similaires

  1. Partager des variables entre plusieurs actions ds un controlleur
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 11/10/2007, 09h38
  2. Partage de données entre fonctions
    Par 13mike dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2007, 11h46
  3. Partage de variables entre fichier .jsp
    Par stephou85 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/05/2007, 09h59
  4. Problème d'appels d'une variable entre fonctions
    Par julien.nasser dans le forum MFC
    Réponses: 12
    Dernier message: 26/04/2006, 09h23
  5. Partage de variables entre plusieurs pages
    Par bud_gw dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/12/2005, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo