Changes for page Basisprojekt

Last modified by mgrawunder on 2025/09/09 08:42

edited by mgrawunder
on 2025/09/03 11:25
Change comment: Uploaded new attachment "1756891512330-186.png", version {1}
edited by mgrawunder
on 2025/09/03 11:48
Change comment: There is no comment for this version

Summary

Details

insert_drive_file Page properties
Content
... ... @@ -295,4 +295,124 @@
295 295  
296 296  [[image:1756890800817-370.png||height="604" width="1121"]]
297 297  
298 -Da man mit REST nicht Nachrichten vom
298 +Da man mit REST nicht Nachrichten vom Server an den Client schicken kann, werden im Basisprojekt dafür WebSockets verwendet.
299 +
300 +Spring bietet eine native Unterstützung von WebSockets. Für eigene Funktionen kann man sich in die Kommunikation über die Serverklasse WebSocketHandler einklinken
301 +
302 +
303 +[[image:1756890924024-346.png||height="377" width="1092"]]
304 +
305 +
306 +Sobald sich jemand beim Server für WebSockets angemeldet hat wird von Spring ein org.springframework.web.socket.messaging.SessionConnectedEvent
307 +geworfen, welches in der folgenden Methode (im WebSocketHandler) aufgefangen wird
308 +
309 +[[image:1756890958794-603.png||height="373" width="1087"]]
310 +
311 +Die Methode ist Observer für das Event SessionConnectedEvent
312 +
313 +Der WebSocketServer kennt die Nutzer und erlaubt das Einloggen nur, wenn Login und Passwort stimmen (durch Spring Security)
314 +
315 +[[image:1756891019715-621.png]]
316 +
317 +1)Aus dem Event kann der Nutzer gelesen werden (der sollte nie leer sein)
318 +
319 +2) Dann wird sich aus dem Repository (später mehr) der Nutzer geholt, der durch den Namen identifiziert ist (z.B. „test1“)
320 +
321 +3) Schließlich werden allen anderen darüber informiert, dass ein neuer Nutzer da ist
322 +
323 +== STOMP ==
324 +
325 +WebSockets haben kein Protokoll (wie z.B. http)
326 +
327 +Es können entweder binäre oder textuelle Daten verarbeitet werden (die jeweiligen Gegenstellen müssen das wissen!)
328 +
329 +Wenn man jetzt mehr als nur Text verschicken möchte, muss man sich überlegen, wie man Objekte z.B. mit JSON serialisiert (analog zu REST)
330 +
331 +STOMP: Streaming Text Oriented Messaging Protocol
332 +
333 +Definiert ein einfaches Protokoll, welches es erlaubt, sinnvoll über WebSockets zu kommunizieren
334 +
335 +Ist ein Teil von Spring
336 +
337 +Methoden sind z.B. CONNECT, SEND oder SUBSCRIBE
338 +
339 +STOMP arbeitet mit Topics
340 +
341 +Ein Client registriert (SUBSCRIBE) sich für bestimmte Ereignistypen
342 +
343 +
344 +§Wenn auf der Server-Seite dieser Typ veröffentlich wird dann wird dies an die jeweils interessierten Clients geschickt
345 +
346 +Publish/Subscribe-Pattern
347 +
348 +[[https:~~/~~/docs.spring.io/spring-framework/reference/web/websocket/stomp.html>>url:https://docs.spring.io/spring-framework/reference/web/websocket/stomp.html]]
349 +
350 +
351 +§Der Server definiert unterschiedliche Topics (je nach Modul)
352 +
353 +§Beim Nutzermanagement aktuell:
354 +
355 +§/topic/users/loggedIn: Es hat sich ein neuer Nutzer angemeldet
356 +
357 +§/topic/users/loggedOut: Ein Nutzer hat sich ausgeloggt
358 +
359 +
360 +[[image:1756891125969-748.png||height="317" width="726"]]
361 +
362 +§Topic-Namen sind Strings, sollte aber Aufbau von oben entsprechen
363 +
364 +§In der Lobby würde es stattdessen /topic/lobbies/* heißen
365 +
366 +== WebSockets: Versenden von Nachrichten ==
367 +
368 +[[image:1756891180516-843.png||height="426" width="801"]]
369 +
370 +[[image:1756891216134-578.png||height="428" width="699"]]
371 +
372 +== Nachrichteninhalt ==
373 +
374 +[[image:1756891254830-647.png||height="101" width="777"]]
375 +
376 +* message kann grundsätzlich alles sein, was serialisiert werden kann
377 +* Man könnte nun einfach die Java-Serialisierung verwenden (im alten Basisprojekt ist das auch so)
378 +* Das hat aber eine Reihe von Nachteilen
379 +** Der Empfänger muss dafür unbedingt auch ein Java-Client sein und er muss exakt dieselbe Klasse bei sich haben, damit der das Objekt wieder zurück in ein Java-Objekt umwandeln kann
380 +** Es gibt eine Reihe von Sicherheitsproblemen
381 +* Besser: Definiere ein gemeinsames Austauschformat, was viele verstehen ~-~-> Im Basisprojekt (und in vielen anderen Projekten auch) JSON verwenden
382 +* Insbesondere Web-Clients (JavaScript) bieten hervorragende Möglichkeiten, an JSON zu verarbeiten
383 +* Client und Server haben sich damit auf Format für den Austausch geeinigt
384 +** Topic: Strings
385 +** Message: JSON
386 +
387 +An den Clilent werden auch bei WebSockets nur DTOs verschickt! (userMapping)
388 +
389 +[[image:1756891375095-158.png||height="266" width="775"]]
390 +
391 +== Wie verbindet sich ein Client mit dem Server? ==
392 +
393 +UserService bietet eine Methode zum Login an. Diese ruft nun aber keine REST-Endpunkt auf (da man sich sowieso bei JEDEM Aufruf authentifizieren muss, macht so ein Endpunkt kein Sinn). Stattdessen wird die Verbindung mit dem WebSocket hergestellt und dort Nama und Passwort überprüft.
394 +
395 +[[image:1756891512330-186.png||height="170" width="820"]]
396 +
397 +=== Auf Server Seite (WebSocketConnectionManager): ===
398 +
399 +[[image:1756891551794-161.png||height="387" width="1019"]]
400 +
401 +1) Variablen definieren
402 +
403 +2) WebSocketClient erzeugen
404 +
405 +3) Daraus WebSocketStompClient machen
406 +
407 +4) Jackson als Mapper definieren (DTO-Object <-> JSON)
408 +
409 +=== [[image:1756891617399-232.png||height="289" width="1006"]] ===
410 +
411 +
412 +1) Asynchron die Verbindung zum Server aufbauen
413 +
414 +2) Wenn erfolgreich in das Hauptmenü wechseln (showScene à später mehr)
415 +
416 +3) Über den Kontext ein Event pushen LoggedInEvent
417 +
418 +4) Jede Serververbindung hat eine Session
attach_file 1756891551794-161.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.mgrawunder
Size
... ... @@ -1,0 +1,1 @@
1 +53.9 KB
Content info
attach_file 1756891617399-232.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.mgrawunder
Size
... ... @@ -1,0 +1,1 @@
1 +49.9 KB
Content info