Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

181
Views
Uso de SimpMessagingTemplate de Spring WebSocket con configuración de puntos finales múltiples

Estoy usando Spring 4.3.5 y WebSocket con SockJS, STOMP y SimpleBrokerMessageHandler.

En mi aplicación, tengo tres extremos de WebSocket separados que se ejecutan en una dirección diferente: /endPointA, /ednpointB, /endpointC Para ser aún más específicos, tengo tres clases de configuración separadas anotadas con anotaciones @Configuration @EnableWebSocketMessageBroker.

También tengo una clase que tiene @Autowired SimpMessagingTemplate.

Finalmente tengo tres clientes, cada uno conectado a un EndPoint diferente. Todos ellos, sin embargo, están suscritos a la "misma" dirección del canal que es /tema/mensajes

  • ClientOne está conectado al punto final A
  • ClientTwo está conectado endpointB
  • ClientThree está conectado endpointC

Cuando uso SimpMessagingTemplate para enviar algo a /topic/messages , todos los clientes reciben este mensaje.

Después de eso tengo dos preguntas:

  1. ¿Hay alguna manera de "aislar" los puntos finales de Web Socket para que el mensaje no se propague a todos los puntos finales?
  2. ¿Por qué está pasando esto realmente aquí?

Investigué un poco (análisis de volcado de pila) y descubrí que para mi configuración tengo:

  • Tres instancias de SimpMessagingTemplate . Sin embargo, siempre uso la misma instancia para enviar un mensaje (debido a @Autowire; además, estoy imprimiendo SimpMessagingTemplate.toString()).
  • Una instancia de SimpleBrokerMessageHandler
  • Tres instancias de SockJsWebSocketHandler

Entonces, me pregunto si la propagación de este mensaje en todos los puntos finales es una "característica" de SimpleBrokerMessageHandler o SimpMessagingTemplate.

about 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Me enfrenté al mismo problema en una aplicación multiinquilino que resolví gracias a este hilo :

Mi punto final de websocket es: ws://127.0.0.1/my-context-app/ws , el archivo de configuración de Java es:

 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").setAllowedOrigins("*"); registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS(); } }

Mis formularios de URL de colas de websocket tienen el prefijo de id de inquilino: /[tenant-id]/[url-of-queue] .

Cada cliente se suscribe en su propia identificación de inquilino. No puede suscribirse a la cola de otro cliente gracias al método WebSocketSecurityConfig.configureInbound(MessageSecurityMetadataSourceRegistry) y un spring bean personalizado que tiene un método 'websocket-queue-subscription-security-check':

 @Configuration public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { messages .simpSubscribeDestMatchers("/**") .access("@customWSSecurityCheck.isSubscriptionAllowed(authentication, message)"); } }

Mi bean personalizado llamado customWSSecurityCheck verifica si el usuario autenticado puede suscribirse en la cola. Tenga en cuenta que CustomAuthentication implementa org.springframework.security.core.Authentication con un atributo de identificador de inquilino adicional que se completa con un código adicional que no se menciona allí en un método de autenticación/filtro de seguridad Spring personalizado:

 @Bean() public class CustomWSSecurityCheck { public boolean isSubscriptionAllowed(CustomAuthentication authentication, Message message) { StompHeaderAccessor sha = StompHeaderAccessor.wrap(message); String url = sha.getDestination().substring(1); String tenantId = url.substring(0, url.indexOf("/")); return tenantId.equals(authentication.getTenantId()); } }

Por supuesto, implica que cada mensaje enviado por el servidor debe tener el prefijo del id. de arrendatario correcto: MessagingService.convertAndSend("[tenant-id]/[url-of-queue]", messagePayload)

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!