MST
星途 面试题库

面试题:Java之Spring Boot中WebSocket应用 - 基础配置

在Spring Boot项目中,如何配置WebSocket以实现简单的消息推送功能?请描述主要的配置步骤和涉及的关键类或注解。
21.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

主要配置步骤

  1. 添加依赖: 在pom.xml文件中添加Spring WebSocket和Spring Messaging依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-messaging</artifactId>
</dependency>
  1. 配置WebSocket: 创建一个配置类,继承WebSocketConfigurer接口,并实现registerWebSocketHandlers方法。
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-endpoint").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/app");
        config.setUserDestinationPrefix("/user");
        config.enableSimpleBroker("/topic", "/queue");
    }
}
  1. 创建消息处理逻辑: 创建一个控制器来处理客户端发送的消息,并向特定目的地发送消息。
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class WebSocketController {

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public String handleHelloMessage(String message) {
        return "Hello, " + message + "!";
    }
}
  1. 前端集成: 在前端页面中使用JavaScript和SockJS来连接WebSocket服务器并发送/接收消息。
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Example</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
</head>
<body>
    <input type="text" id="messageInput" placeholder="Enter message">
    <button onclick="sendMessage()">Send</button>
    <div id="messageOutput"></div>

    <script>
        var socket = new SockJS('/websocket-endpoint');
        var stompClient = Stomp.over(socket);

        stompClient.connect({}, function(frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function(message) {
                document.getElementById('messageOutput').innerHTML += message.body + '<br>';
            });
        });

        function sendMessage() {
            var message = document.getElementById('messageInput').value;
            stompClient.send('/app/hello', {}, message);
            document.getElementById('messageInput').value = '';
        }
    </script>
</body>
</html>

关键类或注解

  1. @EnableWebSocketMessageBroker: 开启使用STOMP协议来传输基于代理(broker)的消息,支持简单的消息代理和用户目的地等功能。
  2. WebSocketConfigurer: 用于配置WebSocket相关的设置,实现registerWebSocketHandlers方法来注册WebSocket端点。
  3. StompEndpointRegistry: 在registerWebSocketHandlers方法中使用,用于注册STOMP端点,支持SockJS回退选项。
  4. MessageBrokerRegistry: 在configureMessageBroker方法中使用,用于配置消息代理的前缀、用户目的地前缀等。
  5. @MessageMapping: 类似于@RequestMapping,用于将客户端发送到特定目的地的消息映射到控制器方法。
  6. @SendTo: 将控制器方法的返回值发送到指定的目的地,通常与@MessageMapping一起使用。