View
642
Download
7
Category
Preview:
Citation preview
WebSocket avec Java EE 7
Florian Beaufumé09/2015
Florian Beaufumé• Architecte logiciel• Spécialisé en Java et web
• Freelance
• florian.beaufume@adeliosys.fr• www.adeliosys.fr• www.linkedin.com/in/fbeaufume
• Protocole
• Outils
• API JavaScript du W3C
• API Java de Java EE 7
• Retour d'expérience
Sommaire
Protocole
Protocoles web
WebSocket
HTTPSPDY
AJAXComet
HTTP/2
SSE
Full-duplex for the web
• HTTP 1.0 :• Sur TCP• Requête-réponse avec fermeture de connexion
• HTTP 1.1 :• Keep-alive
• AJAX :• Requêtes asynchrones• HTML ou data
Historique
• Short polling :• Requêtes périodiques courtes sur le serveur
• Comet :• Long polling :
• Requêtes sur le serveur qui bloquent en attente de réponse• Streaming :
• Requête longue sur le serveur avec plusieurs contenus retournés
• Limitations :• Temps de requête/connexion• Overhead HTTP• Buffering des proxy
Historique
• Server-Sent Event (SSE) :• Push uniquement, en texte, pas de streaming
• SPDY :• HTTP amélioré par Google : compression des headers,
multiplexage des requêtes, etc• Push de ressources (pas d'API JS de callback)• Upgradable en WebSocket
• HTTP/2 :• Standard basé sur SPDY : compression, multiplexage,
upgradable en WebSocket, etc• Push de ressources
Historique
• Protocole de communication full-duplex sur connexion TCP• RFC 6455• Texte ou binaire• Crypté ("wss:") ou pas ("ws:")• Web friendly :
• Upgrade d'HTTP ou indépendant• API JavaScript par W3C• Supporté par les browsers : Ch 16, FF 11, IE 10, Saf 6
• Sous-protocoles, e.g. XMPP, STOMP, SIP• Cible : applications temps réel, event-driven• Bénéfices : réduction de bande passante et latence
WebSocket
Exemples de communication
Agar.io
• JavaScript :• API JavaScript standard du W3C• SocksJS : émulation WebSocket• Socket.io : wrapper WebSocket, AJAX long-polling, etc,
utilisable aussi sur Node.js
• Java :• Les API propriétaires des serveurs d'application• Java API for WebSocket 1.0 (JSR 356, dans Java EE 7)• Spring : fallback transparent sur SocksJS• Atmosphere : framework Java et JS supportant Comet,
SSE, WebSocket, etc.
API
• Chat basique : http://localhost:8080/chat/
Démonstration
• Cryptage via "wss:"
• Authentification :• Pas de mécanisme spécifique• Solutions HTTP possibles, par ex cookies• Ou par message applicatif
• Pas de Same-Origin Policy
• Cross-Site WebSocket Hijacking (CSWSH) :• Similaire à CSRF• Vérifier le header "Origin"• Générer un token aléatoire pour l'upgrade
Sécurité
Outils
Chrome
Dark WebSocket Terminal
JMeter
Wireshark
API JavaScript
• HTML
Code client du chat
• JavaScript
Code client du chat
API JavaScript
API JavaScript
Codes de fermeture
Code Nom Description
0-999 Réservés
1000 CLOSE_NORMAL Fermeture normale
1002 CLOSE_PROTOCOL_ERROR Erreur de protocole
1003 CLOSE_UNSUPPORTED Type de message pas supporté
1009 CLOSE_TOO_LARGE Data frame trop grosse
3000-3999 Pour les librairies et frameworks
4000-4999 Pour les applications
… … …
API Java
• Endpoint WebSocket
Code serveur du chat
• Endpoint WebSocket, avec canaux
Code serveur du chat
• Définition d'un endpoint client ou serveur
Endpoint programmatique
• Utilisations d'un endpoint
• Cycle de vie :• Différent d'une servlet• Une instance par peer• Mono-thread
Endpoint programmatique
• Définition et utilisation
Endpoint serveur par annotation
• Similaire à un endpoint serveur
• @ClientEndpoint plutôt que @ServerEndpoint, donc sans path
Endpoint client par annotation
Session et RemoteEndpoint
Encoder et decoder
• Rétrocompatible• Amélioration pour les MessageHandler via lambdas
API WebSocket 1.1
• Cible Java EE 8• Pas encore final• Améliorations envisagées :
• Support des scopes CDI• API bas niveau pour gérer les frames• Amélioration des extensions• API de filtrage• Amélioration sur les sous-protocoles• API cliente : support de proxy, modes d'AH HTTP, etc.• Broadcast• Sécurité, par exemple @RolesAllowed• Cluster• Etc.
API WebSocket.NEXT
Retour d'expérience
KeyBout
• http://www-adeliosys.rhcloud.com/keybout/• 10 pages HTML
Conception
JSPCDI
WebSocketJSON-P
HTMLBootstrapJavaScriptWebSocket
Browser Serveur d'applicationJava EE 7
• Client vers serveur : actions en texte, exemples :• create-game Capture English 2 10• join-game Tom• claim-word 42 Coalition
• Serveur vers client : notifications en JSON, exemple :• { "type":"games-list", "list":[ { "creator":"Tom", "type":"Capture", "language":"English", "rounds":2, "words":10, "guests":[ ] } ] }
Messages
Couches applicatives
Games
Game
Results
Endpoints Contrôleurs
V1
Play PlayV3
Services
Games
Games
Games
Game
Results
Games
Game
Results
V2 Games
Games
Game
Results
Play
Games
Game
Results
Pages
/games
/game/{id}
/results/{id}
/games
/game/{id}
/results/{id}
/play
Métier
Métier
MétierRéceptionsSécurité
Session WSEmissions
Session WSEmissions
RéceptionsSécurité
RéceptionsSécurité
Session WSEmissions
• Pas lié à WebSocket mais au push :• Besoin d'indentification et catégorisation des clients
• Plusieurs états à coordonner :• Session HTTP• Session WebSocket• Etat applicatif
• Web vs WebSocket : manque de solutions intégrées à ce jour
Impacts sur la conception
• Un path d'endpoint WebSocket doit commencer par "/", pas nécessaire pour JAX-RS
• WildFly 8.0.0 : codes d'erreur pas supportés (corrigé en 8.1.0)
• Quelques limitations d'héritage
• Injection de @Singleton ok, mais pas @RequestScoped
• Clustering pas spécifié :• Load-balancing, réplication de session, fail-over ?• L'API Spring semble aller plus loin
API Java
florian.beaufume@adeliosys.frwww.adeliosys.fr
www.linkedin.com/in/fbeaufume
Merci
Recommended