en PDF

Transcription

en PDF
Programmation Web Avancée
Cours 7 Web Storage Ajax
[email protected]
Plan
1 Introduction/ Généralité et rappels sur le Web/ Javascript : survol du langage
✔
2 Objets/Portée des variables/Tableaux/Rappels MVC ✔
3 Visiteur/Expressions régulières/Git ✔
4 DOM/Observers et MVC ✔
5 Évènements DOM/Rappels sur les clôtures/Set & Map ✔
6 Canvas ✔
7 Web Storage/Ajax
7.1 Webstorage
7.2 Modèle de sécurité de Javascript
7.3 Ajax
2/16
Persistance
Le développement d'application Web moderne (et en particulier mobiles) fait
apparaître un problème de persistance des données
En effet, on souhaîte pouvoir stocker l'état du programme Javascript (pour
pouvoir le restaurer plus tard). On peut aussi vouloir stocker des données
volumineuses pour pouvoir y accéder « hors connexions ».
Les solutions « naïves » ne fonctionnent pas pour Javascript :
Impossible en Javascript d'écrire dans des fichiers du répertoire utilisateur
(modèle de sécurité de Javascript)
Utilisation des cookies : ne permet pas de stocker des donnéer de grande
taille.
Envoi de données au serveur : nuit à l'interactivité
3/16
S
t
o
r
a
g
e
L'object Storage implémente une table associative clé → valeur :
.setItem(key, value) :
Associe dans l'espace de stockage la valeur value à la clé
key (toutes deux sont des chaînes de caractères arbitraires).
.getItem(key) : Renvoie la valeur associée à la clé key
.removeItem(key) : Supprime la valeur associée à la clé key
.length : Renvoie le nombre de clé associées
.key(i) : Renvoie la valeur de la ième clé
Deux objets de type Storage sont accessibles :
localStorage : stockage à durée de vie illimité
sessionStorage : stockage jusqu'à la fin de la session (fermeture de l'onglet ou
du navigateur)
4/16
Démo
On va implémeter un simple compteur de click. On stocke que le nombre de click
à la fois dans le localStorage et dans le sessionStorage.
5/16
Plan
1 Introduction/ Généralité et rappels sur le Web/ Javascript : survol du langage
✔
2 Objets/Portée des variables/Tableaux/Rappels MVC ✔
3 Visiteur/Expressions régulières/Git ✔
4 DOM/Observers et MVC ✔
5 Évènements DOM/Rappels sur les clôtures/Set & Map ✔
6 Canvas ✔
7 Web Storage/Ajax
7.1 Webstorage ✔
7.2 Modèle de sécurité de Javascript
7.3 Ajax
6/16
Accès au données depuis Javascript
Le modèle de sécurité des navigateurs Web impose une politique de même
origine pour l'accès à des données (same origin policy).
Les scripts de deux pages ne peuvent partager des données que si ces pages ont
la même origine
Deux pages ont la même origine si elles ont les même protocole, hôte et port. Si on considère : http://www.example.com/dir/page.html :
✔ http://www.example.com/dir/page2.html ✔ http://www.example.com/dir2/other.html ✔ http://user:[email protected]/dir2/other.html ✖ http://www.example2
.com/dir/page2.html ✖ http://example.com/dir/page2.html ✖ http://www.example.com:8080/dir/page2.html ✖ http
s://www.example.com/dir/page2.html ? http://www.example.com:80/dir/page2.html (dépend des navigateurs)
7/16
Politique de sécurité
Si deux pages ont la même origine, alors elle peuvent se manipuler librement
l'une/l'autre (changer leur DOM, enregistrer/supprimer des gestionnaires
d'évènements, lire l'espace de stockage et les cookies, …)
Cela pose de gros problèmes de sécurité et de confidentialité si les deux pages
n'ont pas la même origine ⇒ interdit.
Attention : un script a pour origine celle de la page qui le charge et non pas l'URL
à laquelle il est stocké
8/16
Exercice
Imaginer un scenario dans lequel une page charge légitimement un script distant
et où ce dernier collecte des informations confidentielles ?
9/16
Plan
1 Introduction/ Généralité et rappels sur le Web/ Javascript : survol du langage
✔
2 Objets/Portée des variables/Tableaux/Rappels MVC ✔
3 Visiteur/Expressions régulières/Git ✔
4 DOM/Observers et MVC ✔
5 Évènements DOM/Rappels sur les clôtures/Set & Map ✔
6 Canvas ✔
7 Web Storage/Ajax
7.1 Webstorage ✔
7.2 Modèle de sécurité de Javascript ✔
7.3 Ajax
10/16
Asynchronous Javascript and XML
Une application Web doit parfois échanger avec un serveur Web :
Calcul coûteux (en mémoire, temps, …)
Centralisation (synchronisation de plusieurs clients, vérification d'identifiants,
de licences, …)
Accès à des données distantes
Utilisation de formulaires HTML :
Nuit à l'interactivité (alternance client/serveur/client/serveur fixée, temps de
transmission)
Perte de la page courante, nécessité de sauver l'état du client localement et re
le restaurer
AJAX : API permettant d'envoyer des requêtes HTTP à un serveur depuis
Javascript de manière asynchrone, en tâche de fond et de récupérer le résultat
11/16
XmlHttpRequest
Objet contenant les (nombreuses) méthodes permettant d'envoyer une requête
GET ou POST à un serveur distant :
new XmlHttpRequest() : création de l'objet
.open(method, url, async) : crée une requête HTTP avec la méthode method
(valant "GET" ou "POST"), vers l'url url. Le booléen async (vrai par défaut)
exécute un envoi asynchrone. On le laissera toujours à vrai.
.send() : envoie la requête au serveur. L'appel retourne immédiatement si async
valait vrai lors de l'ouverture
.responseText : contient la réponse du serveur sous forme de chaîne de
caractères
.status : le code HTTP de la réponse du serveur
.readyState : Un entier entre 0 (requête non envoyée) et 4 (résultat disponible)
12/16
Traîtement asynchrone de la réponse
On se connecte à l'évennement readystatechange de l'objet XmlHttpRequest.
Exemple:
var xhr = new XmlHttpRequest();
xhr.open("GET", "page.php?user=toto", true);
xhr.addEventListener("readystatechange", function (ev) {
if (xhr.status == 200 && xhr.readyState == 4) {
console.log(xhr.responseText);
}
});
xhr.send();
13/16
Avantage/Inconvénients
Avantages :
Évite de recharger la page
Permet d'envoyer plusieurs requêtes de manière asynchrone
Permet de faire autre chose (interaction utilisateur) en attendant que la
réponse arrive
Inconvénient
Sujet à la same origin policy (donc un script ne peut parler qu'au serveur qui l'a
fourni), sauf si le serveur accepte explicitement les connexions (il faut configurer
le serveur Web spécialement).
Interface relativement bas-niveau
Ne permet pas une communication temps réel
On peut demander un résultat d'un autre type que string (document HTML, objet
JSON, …)
14/16
Démo
On souhaite faire une boite de texte qui propose de la complétion à partir d'un
dictionaire en français.
On doit écrire une partie serveur et une partie client.
15/16
Retour sur l'exercice de « sécurité »
Le script malicieux peut-il utiliser AJAX pour envoyer les cookies au serveur ?
16/16