启用 STOMP

spring-messagingspring-websocket 模块中提供了 STOMP over WebSocket 支持。 拥有这些依赖项后,您可以像以下示例所示那样通过 WebSocket 公开 STOMP 端点。

import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.addEndpoint("/portfolio"); (1)
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		config.setApplicationDestinationPrefixes("/app"); (2)
		config.enableSimpleBroker("/topic", "/queue"); (3)
	}
}
1 /portfolio 是 WebSocket(或 SockJS)客户端需要连接以进行 WebSocket 握手操作的端点的 HTTP URL。
2 目标标头以 /app 开头的 STOMP 消息将路由到 @Controller 类中的 @MessageMapping 方法。
3 使用内置消息代理进行订阅和广播,并将目标头以/topic/queue开头的消息路由到代理。

以下示例显示了前面示例的 XML 配置等效项

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/websocket
		https://www.springframework.org/schema/websocket/spring-websocket.xsd">

	<websocket:message-broker application-destination-prefix="/app">
		<websocket:stomp-endpoint path="/portfolio" />
		<websocket:simple-broker prefix="/topic, /queue"/>
	</websocket:message-broker>

</beans>
对于内置的简单代理,/topic/queue前缀没有任何特殊含义。它们仅仅是一种约定,用于区分发布-订阅与点对点消息传递(即,多个订阅者与一个消费者)。当您使用外部代理时,请查看代理的 STOMP 页面以了解它支持哪些 STOMP 目标和前缀。

要从浏览器连接到 STOMP,您可以使用stomp-js/stompjs,它是维护最活跃的 JavaScript 库。

以下示例代码基于它

const stompClient = new StompJs.Client({
       brokerURL: 'ws://domain.com/portfolio',
       onConnect: () => {
           // ...
       }
   });

或者,如果您通过 SockJS 连接,您可以在服务器端使用registry.addEndpoint("/portfolio").withSockJS()启用SockJS 回退,并在 JavaScript 端按照这些说明进行操作。

请注意,前面示例中的stompClient不需要指定loginpasscode头。即使它确实指定了,它们也会在服务器端被忽略(或者更确切地说,被覆盖)。有关身份验证的更多信息,请参见连接到代理身份验证

有关更多示例代码,请参见