Spring WebSockets: שלח הודעות למשתמש ספציפי

1. הקדמה

במדריך זה נתאר כיצד השתמש ב- Spring WebSockets כדי לשלוח הודעות STOMP למשתמש יחיד. זה חשוב מכיוון שלפעמים אנחנו לא רוצים לשדר כל הודעה לכל משתמש. חוץ מזה נדגים כיצד לשלוח הודעות אלה בצורה מאובטחת.

לקבלת היכרות עם WebSockets, עיין במדריך הנהדר הזה כיצד להתחיל ולהפעיל. וכדי לצלול עמוק יותר לאבטחה, עיין במאמר זה כדי להבטיח את יישום ה- WebSockets שלך.

2. תורים, נושאים ונקודות קצה

יש שלוש דרכים עיקריות לומר היכן נשלחות הודעות וכיצד הם מנויים באמצעות Spring WebSockets ו- STOMP:

  1. נושאים - שיחות נפוצות או נושאי צ'אט הפתוחים לכל לקוח או משתמש
  2. תורים - שמור למשתמשים ספציפיים ולהפעלות הנוכחיות שלהם
  3. נקודות קצה - נקודות קצה גנריות

עכשיו, בואו נסתכל במהירות על נתיב הקשר לדוגמא לכל אחד מהם:

  • "/ נושא / סרטים"
  • "/ משתמש / תור / משתמש ספציפי"
  • "/ מאובטח / צ'אט"

חשוב לציין זאת עלינו להשתמש בתורים כדי לשלוח הודעות למשתמשים ספציפיים, מכיוון שנושאים ונקודות קצה אינם תומכים בפונקציונליות זו.

3. תצורה

עכשיו, בואו ללמוד כיצד להגדיר את היישום שלנו כך שנוכל לשלוח הודעות למשתמש ספציפי:

מחלקה ציבורית SocketBrokerConfig מרחיב את AbstractWebSocketMessageBrokerConfigurer {@Override public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ מאובטח / משתמש / תור / משתמש ספציפי"); config.setApplicationDestinationPrefixes ("/ spring-security-mvc-socket"); config.setUserDestinationPrefix ("/ מאובטח / משתמש"); } @Override public void registerStompEndpoints (StompEndpointRegistry registry) {registry.addEndpoint ("/ מאובטח / חדר"). WithSockJS (); }}

בואו נקפיד לכלול יעד משתמש מכיוון שקובע אילו נקודות קצה שמורות למשתמשים בודדים.

אנו מקדימים גם את כל התורים ויעדי המשתמשים שלנו "/מְאוּבטָח" כדי לגרום להם לדרוש אימות. עבור נקודות קצה לא מוגנות, אנו יכולים להוריד את ה- "/מְאוּבטָח" קידומת (כתוצאה מהגדרות האבטחה האחרות שלנו).

מ pom.xml נקודת מבט, אין צורך בתלות נוספת.

4. מיפוי כתובות אתרים

אנו רוצים שהלקוח שלנו יירשם לתור באמצעות מיפוי כתובות אתרים התואם את הדפוס הבא:

"/ משתמש / תור / עדכונים"

מיפוי זה ישתנה באופן אוטומטי על ידי UserDestinationMessageHandler לכתובת הספציפית למשתמש.

לדוגמא, אם יש לנו משתמש בשם “User123”הכתובת המתאימה תהיה:

"/ queue / updates-user123"

בצד השרת, אנו נשלח את התגובה הספציפית למשתמש שלנו באמצעות דפוס מיפוי כתובות אתרים הבא:

"/ user / {username} / queue / updates"

גם זה יהפוך למיפוי נכון של כתובות אתרים שכבר נרשמנו לצד הלקוח.

לפיכך, אנו רואים זאת המרכיבים החיוניים כאן הם כפולים:

  1. הכן מראש את קידומת יעד המשתמש שצוין (מוגדרת ב AbstractWebSocketMessageBrokerConfigurer).
  2. להשתמש "/תוֹר" איפשהו בתוך המיפוי.

בחלק הבא נבחן בדיוק כיצד לעשות זאת.

5. הפעלת convertAndSendToUser ()

אנו יכולים להפעיל באופן לא סטטי convertAndSendToUser () מ SimpMessagingTemplate אוֹ SimpMessageSendingOperations:

@Autowired פרטי SimpMessagingTemplate simpMessagingTemplate; @MessageMapping ("/ מאובטח / חדר") public void sendSpecific (@Payload Message msg, משתמש ראשי, @Header ("simpSessionId") String sessionId) זורק Exception {OutputMessage out = new OutputMessage (msg.getFrom (), msg.getText (), SimpleDateFormat חדש ("HH: mm"). פורמט (תאריך חדש ())); simpMessagingTemplate.convertAndSendToUser (msg.getTo (), "/ מאובטח / משתמש / תור / משתמש ספציפי", מחוץ); }

אולי שמתם לב:

@Header ("simpSessionId") מחרוזת מזהה

ה @כּוֹתֶרֶת ביאור מאפשר גישה לכותרות שנחשפות על ידי ההודעה הנכנסת. לדוגמא, אנו יכולים לתפוס את הזרם sessionId ללא צורך ביירוטים מסובכים. בדומה לכך, אנו יכולים לגשת למשתמש הנוכחי באמצעות קֶרֶן.

חשוב לציין, הגישה בה אנו נוקטים במאמר זה מספקת התאמה אישית רבה יותר בהשוואה ל @ sendToUser ביאור ביחס למיפוי כתובות אתרים. למידע נוסף על הערה זו, עיין במאמר נהדר זה.

בצד הלקוח, נשתמש לְחַבֵּר() ב- JavaScript ל- אתחל מופע SockJS והתחבר לשרת WebSocket שלנו באמצעות STOMP:

שקע var = SockJS חדש ('/ מאובטח / חדר'); var stompClient = Stomp.over (שקע); var sessionId = ""; stompClient.connect ({}, פונקציה (פריים) {var url = stompClient.ws._transport.url; url = url.replace ("ws: // localhost: 8080 / spring-security-mvc-socket / מאובטח / חדר / "," "); url = url.replace (" / שקע רשת "," "); url = url.replace (/ ^ [0-9] + \ //," "); console.log (" הנוכחי שלך הפגישה היא: "+ url); sessionId = url;} 

אנו גם ניגשים לספקים sessionId ולצרף זאת ל" מאובטח / חדר מיפוי כתובות אתרים. זה נותן לנו את היכולת לספק באופן דינמי וידני תור מנוי ספציפי למשתמש:

stompClient.subscribe ('מאובטח / משתמש / תור / משתמש ספציפי' + '-משתמש' + that.sessionId, פונקציה (msgOut) {// מטפל בהודעות} 

לאחר שהכל מוגדר, עלינו לראות:

ובמסוף השרתים שלנו:

6. מסקנה

עיין בבלוג הרשמי של האביב ובתיעוד הרשמי למידע נוסף בנושא זה.

כמו תמיד, דוגמאות הקוד המשמשות במאמר זה זמינות באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found