Your SlideShare is downloading. ×

Stateless is priceless

842
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
842
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Stateless is pricelessmercredi 7 mars 12
  • 2. Thomas Recloux Développeur / Architecte indépendant @thomasrecloux https://github.com/trecloux/ Ch’ti JUG (co) leadermercredi 7 mars 12
  • 3. Stateless SessionLess is pricelessmercredi 7 mars 12
  • 4. mercredi 7 mars 12
  • 5. Session Http ?mercredi 7 mars 12
  • 6. Serveur JSESSIONID=1337AZERTYUIOPmercredi 7 mars 12
  • 7. Serveur JSESSIONID=1337AZERTYUIOP JSESSIONID=1337AZERTYUIOPmercredi 7 mars 12
  • 8. Serveur 1337AZERTYUIOP user com.myapp.User@45567 JSESSIONID=1337AZERTYUIOP roles [CONFIGURATION, DICTATOR] JSESSIONID=1337AZERTYUIOPmercredi 7 mars 12
  • 9. Serveur 1337AZERTYUIOP user com.myapp.User@45567 JSESSIONID=1337AZERTYUIOP roles [CONFIGURATION, DICTATOR] DFGHH76434455 user com.myapp.User@24098 JSESSIONID=1337AZERTYUIOP roles []mercredi 7 mars 12
  • 10. Pour quoi faire ?mercredi 7 mars 12
  • 11. 1 - Authentification En cas d’authentification par formulaire Placer un objet marqueur en session pour mémoriser l’authentificationmercredi 7 mars 12
  • 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
  • 13. Serveur GET /petsearch?query=dog 1337AZERTYUIOPmercredi 7 mars 12
  • 14. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet]mercredi 7 mars 12
  • 15. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet] GET /pet?idx=2mercredi 7 mars 12
  • 16. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet] GET /pet?idx=2 pet com.myapp.Pet@566577mercredi 7 mars 12
  • 17. Serveur GET /petsearch?query=dog 1337AZERTYUIOP search [Pet, Pet, Pet, Pet, Pet, Pet] GET /pet?idx=2 pet com.myapp.Pet@566577 POST /petmercredi 7 mars 12
  • 18. 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
  • 19. Il est ou le problème ?mercredi 7 mars 12
  • 20. 1 - Répartition de chargemercredi 7 mars 12
  • 21. A sessionmercredi 7 mars 12
  • 22. A session B ?mercredi 7 mars 12
  • 23. A session Load Balancer 1337AZE RTYUIOP A Bmercredi 7 mars 12
  • 24. A session Load Load Balancer Balancer 1337AZE 1337AZE RTYUIOP A A B RTYUIOPmercredi 7 mars 12
  • 25. 2 - Tolérance aux pannesmercredi 7 mars 12
  • 26. A session Load Load Balancer Balancer 1337AZE 1337AZE RTYUIOP A A B RTYUIOPmercredi 7 mars 12
  • 27. A session Load Load Balancer Balancer 1337AZE 1337AZE RTYUIOP A A B RTYUIOPmercredi 7 mars 12
  • 28. A session Load Load Balancer Balancer 1337AZE RTYUIOP A B ?mercredi 7 mars 12
  • 29. A session Load Load Load Load Balancer Balancer Balancer Balancer A B sessionmercredi 7 mars 12
  • 30. 3 - Fourre tout Difficile de gérer le cycle de vie des objets en session Syndrome de la session obèse, refactoring complexe Typage faiblemercredi 7 mars 12
  • 31. 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
  • 32. 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 inutilesmercredi 7 mars 12
  • 33. 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 migrationmercredi 7 mars 12
  • 34. 7 - Ongletsmercredi 7 mars 12
  • 35. Alors, on fait comment ?mercredi 7 mars 12
  • 36. Stocker l’état ailleursmercredi 7 mars 12
  • 37. URLmercredi 7 mars 12
  • 38. Serveur GET /petsearch?query=dog 1337AZERTYUIOPmercredi 7 mars 12
  • 39. Serveur GET /petsearch?query=dog 1337AZERTYUIOPmercredi 7 mars 12
  • 40. Serveur GET /petsearch?query=dog 1337AZERTYUIOP GET /pet/543/chimpanzeemercredi 7 mars 12
  • 41. Serveur GET /petsearch?query=dog 1337AZERTYUIOP GET /pet/543/chimpanzee POST /pet/543mercredi 7 mars 12
  • 42. 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 ongletsmercredi 7 mars 12
  • 43. 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 POSTmercredi 7 mars 12
  • 44. Etat coté client Arbre DOM Variables globales JavaScript Applications «Single Page» Ex : GWT Stockage local HTML5 Web Storage, Indexed DB, Web SQLmercredi 7 mars 12
  • 45. Etat coté serveur Base de données Cache distribuémercredi 7 mars 12
  • 46. mercredi 7 mars 12
  • 47. mercredi 7 mars 12
  • 48. Spring MVC / Securitymercredi 7 mars 12
  • 49. 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
  • 50. spring-security.xml <http .... create-session="stateless"> .... <remember-me key="myRememberMeKey" /> </http> login.jsp <form id=form Texte Texte action="<c:url value="/j_spring_security_check"/>" method="POST"> <input type="hidden" value="true" name="_spring_security_remember_me" /> ... </form>mercredi 7 mars 12
  • 51. Entité en cours de modification Se passer du très utile @SessionAttributesmercredi 7 mars 12
  • 52. Serveur 1337AZERTYUIOP pet com.myapp.Pet@566577 GET /pet/573/chimpanzee POST /petmercredi 7 mars 12
  • 53. Serveur 1337AZERTYUIOP pet com.myapp.Pet@566577 GET /pet/573/chimpanzee POST /pet 1 - Récupérer l’attribut en session 2 - «Binding» à partir des données du POST 3 - Appel de la méthode du contrôleurmercredi 7 mars 12
  • 54. Serveur 1337AZERTYUIOP pet com.myapp.Pet@566577 GET /pet/573/chimpanzee POST /pet 1 - Récupérer l’attribut en session 1 - Charger l’entité depuis la base de données 2 - «Binding» à partir des données du POST 3 - Appel de la méthode du contrôleurmercredi 7 mars 12
  • 55. 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ôleurmercredi 7 mars 12
  • 56. Démomercredi 7 mars 12
  • 57. Questions ?mercredi 7 mars 12