stateless is priceless

Post on 09-Jun-2015

901 Views

Category:

Documents

9 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related