09 - Spring Boot WebSocket

03/03/2025 - 4 phút

Follow  on Google News

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot WebSocket, cách tích hợp WebSocket trong ứng dụng Spring Boot.

1. Giới Thiệu

Trong thời đại ứng dụng hiện đại, real-time communication (giao tiếp thời gian thực) là một phần quan trọng giúp cải thiện trải nghiệm người dùng. Spring Boot WebSocket cho phép chúng ta xây dựng các ứng dụng như:

  • Chat real-time giữa nhiều người dùng.
  • Thông báo push cho ứng dụng web.
  • Truyền dữ liệu trực tiếp mà không cần tải lại trang.

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot WebSocket, cách cấu hình WebSocket server và tạo một ứng dụng chat real-time đơn giản.


2. WebSocket Là Gì?

WebSocket là một giao thức cung cấp kết nối hai chiều (full-duplex) giữa client và server thông qua một connection duy nhất. Điều này giúp dữ liệu có thể được gửi và nhận ngay lập tức mà không cần yêu cầu liên tục từ client như HTTP truyền thống.

HTTPWebSocket
Kết nối mỗi request-responseKết nối duy trì liên tục
Chỉ có thể request từ clientServer có thể gửi dữ liệu bất kỳ lúc nào
Tốn nhiều tài nguyênTiết kiệm tài nguyên, độ trễ thấp

Spring Boot hỗ trợ WebSocket một cách dễ dàng thông qua thư viện Spring WebSocket.


3. Cài Đặt WebSocket Trong Spring Boot

3.1. Thêm Dependency WebSocket

Đầu tiên, bạn cần thêm dependency vào pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

3.2. Cấu Hình WebSocket Server

Tạo một lớp cấu hình WebSocket WebSocketConfig.java:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/chat").setAllowedOrigins("*");
    }
}
  • @EnableWebSocket: Bật tính năng WebSocket trong ứng dụng.
  • addHandler(): Đăng ký endpoint /chat để xử lý WebSocket.

3.3. Tạo WebSocket Handler

Tạo ChatWebSocketHandler.java để xử lý tin nhắn WebSocket:

import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.concurrent.CopyOnWriteArrayList;

public class ChatWebSocketHandler extends TextWebSocketHandler {
    private static final CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        sessions.add(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        for (WebSocketSession s : sessions) {
            s.sendMessage(message);
        }
    }
}
  • Lưu danh sách client đang kết nối trong sessions.
  • Khi client gửi tin nhắn, tất cả client khác sẽ nhận được tin nhắn đó (broadcast chat).

4. Xây Dựng Ứng Dụng Chat WebSocket Với Spring Boot

4.1. Tạo Trang Web Client (HTML + JavaScript)

Tạo index.html trong thư mục resources/static/:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat</title>
    <script>
        var socket = new WebSocket("ws://localhost:8080/chat");
        socket.onmessage = function(event) {
            var messages = document.getElementById("messages");
            var message = document.createElement("p");
            message.textContent = event.data;
            messages.appendChild(message);
        };
        function sendMessage() {
            var input = document.getElementById("message");
            socket.send(input.value);
            input.value = "";
        }
    </script>
</head>
<body>
    <h2>Spring Boot WebSocket Chat</h2>
    <div id="messages"></div>
    <input type="text" id="message" placeholder="Nhập tin nhắn...">
    <button onclick="sendMessage()">Gửi</button>
</body>
</html>
  • Tạo kết nối WebSocket đến /chat.
  • Hiển thị tin nhắn nhận được từ WebSocket server.
  • Gửi tin nhắn đến WebSocket server khi nhấn nút.

4.2. Chạy Ứng Dụng

  • Chạy Spring Boot: mvn spring-boot:run
  • Mở trình duyệt và truy cập http://localhost:8080/index.html
  • Mở hai tab trình duyệt, nhập tin nhắn và thấy nó xuất hiện trên cả hai tab! 🎉

5. Bảo Mật WebSocket Với Spring Security

Để bảo mật WebSocket, bạn có thể sử dụng JWT hoặc xác thực Basic Auth. Ví dụ, yêu cầu xác thực trước khi kết nối WebSocket:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .httpBasic()
            .and()
            .csrf().disable();
        return http.build();
    }
}
  • Yêu cầu xác thực HTTP Basic trước khi truy cập WebSocket.
  • Vô hiệu hóa CSRF để tránh lỗi khi kết nối WebSocket.

6. Tích Hợp WebSocket Với STOMP và SockJS

Nếu bạn muốn sử dụng WebSocket nâng cao hơn, Spring Boot hỗ trợ STOMP + SockJS:

  • STOMP giúp quản lý tin nhắn tốt hơn.
  • SockJS giúp hỗ trợ trình duyệt cũ không hỗ trợ WebSocket.

Ví dụ cấu hình STOMP:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
    }
}

7. Kết Luận

Spring Boot WebSocket giúp bạn dễ dàng xây dựng ứng dụng real-time như chat và thông báo push.

Tóm tắt:

  • Sử dụng WebSocket để giao tiếp real-time giữa client và server.
  • Tạo một chat server đơn giản với WebSocketHandler.
  • Tích hợp bảo mật với Spring Security.
  • Nâng cấp với STOMP + SockJS để hỗ trợ trình duyệt cũ.

👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot RabbitMQ, giúp xây dựng hệ thống message queue phân tán mạnh mẽ!