websocket avec java ee 7

44
WebSocket avec Java EE 7 Florian Beaufumé 09/2015

Upload: florian-beaufume

Post on 20-Jan-2017

642 views

Category:

Technology


7 download

TRANSCRIPT

Page 1: WebSocket avec Java EE 7

WebSocket avec Java EE 7

Florian Beaufumé09/2015

Page 2: WebSocket avec Java EE 7

Florian Beaufumé• Architecte logiciel• Spécialisé en Java et web

• Freelance

[email protected]• www.adeliosys.fr• www.linkedin.com/in/fbeaufume

Page 3: WebSocket avec Java EE 7

• Protocole

• Outils

• API JavaScript du W3C

• API Java de Java EE 7

• Retour d'expérience

Sommaire

Page 4: WebSocket avec Java EE 7

Protocole

Page 5: WebSocket avec Java EE 7

Protocoles web

WebSocket

HTTPSPDY

AJAXComet

HTTP/2

SSE

Full-duplex for the web

Page 6: WebSocket avec Java EE 7

• 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

Page 7: WebSocket avec Java EE 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

Page 8: WebSocket avec Java EE 7

• 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

Page 9: WebSocket avec Java EE 7

• 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

Page 10: WebSocket avec Java EE 7

Exemples de communication

Page 11: WebSocket avec Java EE 7

Agar.io

Page 12: WebSocket avec Java EE 7

• 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

Page 14: WebSocket avec Java EE 7

• 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é

Page 15: WebSocket avec Java EE 7

Outils

Page 16: WebSocket avec Java EE 7

Chrome

Page 17: WebSocket avec Java EE 7

Dark WebSocket Terminal

Page 18: WebSocket avec Java EE 7

JMeter

Page 19: WebSocket avec Java EE 7

Wireshark

Page 20: WebSocket avec Java EE 7

API JavaScript

Page 21: WebSocket avec Java EE 7

• HTML

Code client du chat

Page 22: WebSocket avec Java EE 7

• JavaScript

Code client du chat

Page 23: WebSocket avec Java EE 7

API JavaScript

Page 24: WebSocket avec Java EE 7

API JavaScript

Page 25: WebSocket avec Java EE 7

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

… … …

Page 26: WebSocket avec Java EE 7

API Java

Page 27: WebSocket avec Java EE 7

• Endpoint WebSocket

Code serveur du chat

Page 28: WebSocket avec Java EE 7

• Endpoint WebSocket, avec canaux

Code serveur du chat

Page 29: WebSocket avec Java EE 7

• Définition d'un endpoint client ou serveur

Endpoint programmatique

Page 30: WebSocket avec Java EE 7

• Utilisations d'un endpoint

• Cycle de vie :• Différent d'une servlet• Une instance par peer• Mono-thread

Endpoint programmatique

Page 31: WebSocket avec Java EE 7

• Définition et utilisation

Endpoint serveur par annotation

Page 32: WebSocket avec Java EE 7

• Similaire à un endpoint serveur

• @ClientEndpoint plutôt que @ServerEndpoint, donc sans path

Endpoint client par annotation

Page 33: WebSocket avec Java EE 7

Session et RemoteEndpoint

Page 34: WebSocket avec Java EE 7

Encoder et decoder

Page 35: WebSocket avec Java EE 7

• Rétrocompatible• Amélioration pour les MessageHandler via lambdas

API WebSocket 1.1

Page 36: WebSocket avec Java EE 7

• 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

Page 37: WebSocket avec Java EE 7

Retour d'expérience

Page 38: WebSocket avec Java EE 7

KeyBout

Page 39: WebSocket avec Java EE 7

• http://www-adeliosys.rhcloud.com/keybout/• 10 pages HTML

Conception

JSPCDI

WebSocketJSON-P

HTMLBootstrapJavaScriptWebSocket

Browser Serveur d'applicationJava EE 7

Page 40: WebSocket avec 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

Page 41: WebSocket avec Java EE 7

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

Page 42: WebSocket avec Java EE 7

• 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

Page 43: WebSocket avec Java EE 7

• 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