Stateless is priceless
-
Upload
thomas-recloux -
Category
Documents
-
view
893 -
download
9
Transcript of Stateless is priceless
Stateless is priceless
mercredi 7 mars 12
Thomas Recloux
Développeur / Architecte indépendant
@thomasrecloux
https://github.com/trecloux/
Ch’ti JUG (co) leader
mercredi 7 mars 12
Stateless SessionLess is priceless
mercredi 7 mars 12
mercredi 7 mars 12
Session Http ?
mercredi 7 mars 12
JSESSIONID=1337AZERTYUIOP
Serveur
mercredi 7 mars 12
JSESSIONID=1337AZERTYUIOP
JSESSIONID=1337AZERTYUIOP
Serveur
mercredi 7 mars 12
JSESSIONID=1337AZERTYUIOP
JSESSIONID=1337AZERTYUIOP
1337AZERTYUIOP
user com.myapp.User@45567
roles [CONFIGURATION, DICTATOR]
Serveur
mercredi 7 mars 12
JSESSIONID=1337AZERTYUIOP
JSESSIONID=1337AZERTYUIOP
1337AZERTYUIOP
user com.myapp.User@45567
roles [CONFIGURATION, DICTATOR]
DFGHH76434455
user com.myapp.User@24098
roles []
Serveur
mercredi 7 mars 12
Pour quoi faire ?
mercredi 7 mars 12
1 - Authentification
En cas d’authentification par formulaire
Placer un objet marqueur en session pour mémoriser l’authentification
mercredi 7 mars 12
2 - Etat conversationnel
Utiliser la session pour stocker l’état de la conversation entre le client et le serveur
Exemples :
Panier
Entité en cours de modification
....
mercredi 7 mars 12
1337AZERTYUIOP
Serveur
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
search [Pet, Pet, Pet, Pet, Pet, Pet]
Serveur
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
search [Pet, Pet, Pet, Pet, Pet, Pet]
Serveur
GET /pet?idx=2
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
search [Pet, Pet, Pet, Pet, Pet, Pet]
pet com.myapp.Pet@566577
Serveur
GET /pet?idx=2
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
search [Pet, Pet, Pet, Pet, Pet, Pet]
pet com.myapp.Pet@566577
Serveur
GET /pet?idx=2
POST /pet
GET /petsearch?query=dog
mercredi 7 mars 12
3 - Cache
Eviter de recharger des objets depuis leur système de stockage
Exemples :
Utilisateur, Roles
Objets fréquemment utilisés : Client, Articles, .....
mercredi 7 mars 12
Il est ou le problème ?
mercredi 7 mars 12
1 - Répartition de charge
mercredi 7 mars 12
Asession
mercredi 7 mars 12
Asession
B
?
mercredi 7 mars 12
Asession
B
Load Balancer
1337AZERTYUIOP
A
mercredi 7 mars 12
Asession
B
Load Balancer
1337AZERTYUIOP
A
Load Balancer
1337AZERTYUIOP
A
mercredi 7 mars 12
2 - Tolérance aux pannes
mercredi 7 mars 12
Asession
B
Load Balancer
1337AZERTYUIOP
A
Load Balancer
1337AZERTYUIOP
A
mercredi 7 mars 12
Asession
B
Load Balancer
1337AZERTYUIOP
A
Load Balancer
1337AZERTYUIOP
A
mercredi 7 mars 12
Asession
B
?
Load Balancer
1337AZERTYUIOP
A
Load Balancer
mercredi 7 mars 12
Asession
BLoad
BalancerLoad
Balancer
session
Load Balancer
A
Load Balancer
mercredi 7 mars 12
3 - Fourre tout
Difficile de gérer le cycle de vie des objets en session
Syndrome de la session obèse, refactoring complexe
Typage faible
mercredi 7 mars 12
4 - Scalabilité
En cas de forte charge, les sessions existantes ne peuvent pas profiter de l’ajout de nouveaux serveurs
Quelle taille mémoire provisionner pour ma session ?
mercredi 7 mars 12
5 - Quelle durée de vie
Réglage du timeout de session : durée de survie de la session après la dernière requête de l’utilisateur
Trop court : la session ne survie pas à une pause dans l’utilisation de l’application
Trop long : utilisation de ressources inutiles
mercredi 7 mars 12
6 - Mise à jour de l’application
La session contient des objets complexes de l’application, elle est donc liée à une version de l’application
Procédures complexe de migration
mercredi 7 mars 12
7 - Onglets
mercredi 7 mars 12
Alors, on fait comment ?
mercredi 7 mars 12
Stocker l’état ailleurs
mercredi 7 mars 12
URL
mercredi 7 mars 12
1337AZERTYUIOP
Serveur
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
Serveur
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
Serveur
GET /pet/543/chimpanzee
GET /petsearch?query=dog
mercredi 7 mars 12
1337AZERTYUIOP
Serveur
GET /pet/543/chimpanzee
GET /petsearch?query=dog
POST /pet/543
mercredi 7 mars 12
Cookie
Echangé à chaque requête/réponse
Peut être signé
4Ko Maximum : privilégier l’échange d’identifiants vs objets complexes
Peut être persistant
<!> Partagé entre les onglets
mercredi 7 mars 12
Champs caché
Ex : Mémoriser l’identifiant de l’entité en cours de modification
Onglet friendly
<!> Vérifier les droits lors du GET et du POST
mercredi 7 mars 12
Etat coté client
Arbre DOM
Variables globales JavaScript
Applications «Single Page»
Ex : GWT
Stockage local HTML5
Web Storage, Indexed DB, Web SQL
mercredi 7 mars 12
Etat coté serveur
Base de données
Cache distribué
mercredi 7 mars 12
mercredi 7 mars 12
mercredi 7 mars 12
Spring MVC / Security
mercredi 7 mars 12
Authentification
Spring security 3.1 dispose d’un mode «stateless»
Qui ne fonctionne pas en authentification par formulaire
Solution : utiliser l’authentification «Remember Me»
<!> Uniquement en mode «Token»
mercredi 7 mars 12
<http .... create-session="stateless"> .... <remember-me key="myRememberMeKey" /></http>
<form id='form' action="<c:url value="/j_spring_security_check"/>" method="POST">
<input type="hidden" value="true" name="_spring_security_remember_me" />
...</form>
TexteTexte
spring-security.xml
login.jsp
mercredi 7 mars 12
Entité en cours de modification
Se passer du très utile @SessionAttributes
mercredi 7 mars 12
1337AZERTYUIOP
pet com.myapp.Pet@566577
Serveur
GET /pet/573/chimpanzee
POST /pet
mercredi 7 mars 12
1337AZERTYUIOP
pet com.myapp.Pet@566577
Serveur
GET /pet/573/chimpanzee
POST /pet
1 - Récupérer l’attribut en session2 - «Binding» à partir des données du POST3 - Appel de la méthode du contrôleur
mercredi 7 mars 12
1337AZERTYUIOP
pet com.myapp.Pet@566577
Serveur
GET /pet/573/chimpanzee
POST /pet
1 - Récupérer l’attribut en session1 - Charger l’entité depuis la base de données2 - «Binding» à partir des données du POST3 - Appel de la méthode du contrôleur
mercredi 7 mars 12
Une solution :
Annoter une méthode avec @ModelAttribute permet de l’insérer dans le traitement de la requête avant le «binding»
Cette méthode peut prendre les même paramètres qu’une méthode de Contrôleur
mercredi 7 mars 12
Démo
mercredi 7 mars 12
Questions ?
mercredi 7 mars 12