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
HTTP
SPDY
AJAX
Comet
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
JSP
CDI
WebSocket
JSON-P
HTML
Bootstrap
JavaScript
WebSocket
Browser
Serveur d'application
Java 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éceptions
Sécurité
Session WS
Emissions
Session WS
Emissions
Réceptions
Sécurité
Réceptions
Sécurité
Session WS
Emissions
• 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.fr
www.adeliosys.fr
www.linkedin.com/in/fbeaufume
Merci

WebSocket avec Java EE 7

  • 1.
    WebSocket avec JavaEE 7 Florian Beaufumé 09/2015
  • 2.
    Florian Beaufumé • Architectelogiciel • Spécialisé en Java et web • Freelance • florian.beaufume@adeliosys.fr • www.adeliosys.fr • www.linkedin.com/in/fbeaufume
  • 3.
    • Protocole • Outils •API JavaScript du W3C • API Java de Java EE 7 • Retour d'expérience Sommaire
  • 4.
  • 5.
  • 6.
    • 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
  • 7.
    • 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
  • 8.
    • 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
  • 9.
    • Protocole decommunication 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
  • 10.
  • 11.
  • 12.
    • 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
  • 13.
    • Chat basique: http://localhost:8080/chat/ Démonstration
  • 14.
    • 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é
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
    Codes de fermeture CodeNom 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 … … …
  • 26.
  • 27.
  • 28.
    • Endpoint WebSocket,avec canaux Code serveur du chat
  • 29.
    • Définition d'unendpoint client ou serveur Endpoint programmatique
  • 30.
    • Utilisations d'unendpoint • Cycle de vie : • Différent d'une servlet • Une instance par peer • Mono-thread Endpoint programmatique
  • 31.
    • Définition etutilisation Endpoint serveur par annotation
  • 32.
    • Similaire àun endpoint serveur • @ClientEndpoint plutôt que @ServerEndpoint, donc sans path Endpoint client par annotation
  • 33.
  • 34.
  • 35.
    • Rétrocompatible • Améliorationpour les MessageHandler via lambdas API WebSocket 1.1
  • 36.
    • Cible JavaEE 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
  • 37.
  • 38.
  • 39.
    • http://www-adeliosys.rhcloud.com/keybout/ • 10pages HTML Conception JSP CDI WebSocket JSON-P HTML Bootstrap JavaScript WebSocket Browser Serveur d'application Java EE 7
  • 40.
    • Client versserveur : 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
  • 41.
    Couches applicatives Games Game Results Endpoints Contrôleurs V1 PlayPlayV3 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éceptions Sécurité Session WS Emissions Session WS Emissions Réceptions Sécurité Réceptions Sécurité Session WS Emissions
  • 42.
    • 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
  • 43.
    • Un pathd'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
  • 44.