0Pricing
WebSockets & Real-Time Systems with Spring · บทเรียน

ตัวดักจับ WebSocket

ใช้ตัวดักจับ WebSocket เพื่อประมวลผลข้อความและเหตุการณ์การเชื่อมต่อล่วงหน้าและภายหลัง

ตัวดักจับ WebSocket เป็นบทเรียน WebSockets & Real-Time Systems with Spring ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน WebSockets & Real-Time Systems with Spring และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส WebSockets & Real-Time Systems with Spring มีบทเรียนทั้งหมด 4 บทเรียน

บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ

Welcome to Interceptors!

In Spring WebSockets, Interceptors act like gatekeepers or event listeners that can observe and modify the WebSocket lifecycle.

They allow you to perform actions like logging, authentication, or modifying data at specific points during a connection or message exchange.

Lifecycle Hooks

Think of the WebSocket process:

  • Handshake: Initial HTTP request to upgrade to WebSocket.
  • Connection: WebSocket link is established.
  • Message Exchange: Data flows between client and server.
  • Disconnection: WebSocket link closes.

Interceptors let you "hook" into these stages.

Intercepting the Handshake

The HandshakeInterceptor is crucial for the very first step: the WebSocket handshake.

It lets you:

  • Inspect the HTTP request before the WebSocket connection is established.
  • Perform authentication or authorization checks.
  • Add attributes to the WebSocket session.

You can decide whether to allow the handshake to proceed.

Coding a Handshake Interceptor

Let's create a simple HandshakeInterceptor that logs when a connection attempt begins and ends. This is useful for monitoring or debugging.

Notice the beforeHandshake and afterHandshake methods.

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import java.util.Map;

public class MyHandshakeInterceptor implements HandshakeInterceptor {

  @Override
  public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                 WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
    System.out.println(">>> Handshake starting for: " + request.getURI());
    // 'attributes' map can be used to pass data to WebSocket session
    return true; // Allow handshake to proceed
  }

  @Override
  public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response,
                             WebSocketHandler wsHandler, Exception exception) {
    System.out.println("<<< Handshake completed for: " + request.getURI());
    if (exception != null) {
      System.err.println("Handshake failed: " + exception.getMessage());
    }
  }
}

Integrating Handshake Interceptors

To make our MyHandshakeInterceptor active, we need to register it within our Spring Boot application's WebSocket configuration.

Run this code and try connecting to ws://localhost:8080/ws from a browser's developer console (e.g., new WebSocket('ws://localhost:8080/ws')) to see the logs!

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.server.HandshakeInterceptor;
import java.util.Map;

@SpringBootApplication
public class Main {
  public static void main(String[] args) {
    SpringApplication.run(Main.class, args);
  }
}

// MyHandshakeInterceptor.java (nested for brevity)
class MyHandshakeInterceptor implements HandshakeInterceptor {
  @Override
  public boolean beforeHandshake(ServerHttpRequest req, ServerHttpResponse res,
                                 org.springframework.web.socket.WebSocketHandler h, Map<String, Object> a) {
    System.out.println(">>> Handshake: " + req.getURI());
    return true;
  }
  @Override
  public void afterHandshake(ServerHttpRequest req, ServerHttpResponse res,
                             org.springframework.web.socket.WebSocketHandler h, Exception e) {
    System.out.println("<<< Handshake done: " + req.getURI());
  }
}

// WebSocketConfig.java (nested for brevity)
@Configuration
@EnableWebSocket
class WebSocketConfig implements WebSocketConfigurer {
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry r) {
    r.addHandler(new TextWebSocketHandler(), "/ws")
     .addInterceptors(new MyHandshakeInterceptor())
     .setAllowedOrigins("*");
  }
}

Intercepting STOMP Messages

While HandshakeInterceptor handles initial connections, ChannelInterceptor focuses on STOMP messages flowing through Spring's message broker.

These interceptors operate on the messaging channels, allowing you to inspect or modify messages before they reach their destination or after they are sent.

Coding a Channel Interceptor

A ChannelInterceptor provides methods like preSend, postSend, and afterSendCompletion.

The preSend method is commonly used to inspect or modify a message before it is sent to its destination (e.g., a STOMP topic or user queue).

import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.ChannelInterceptor;

public class MyChannelInterceptor implements ChannelInterceptor {

  @Override
  public Message<?> preSend(Message<?> message, MessageChannel channel) {
    // Log the message or perform security checks
    System.out.println("Intercepted STOMP message: " + message.getHeaders());
    // You can modify the message here
    return message; // Return the message to proceed
  }

  // Other methods like postSend, afterSendCompletion...
}

Integrating Channel Interceptors

To register a ChannelInterceptor, you typically use a configuration class that extends WebSocketMessageBrokerConfigurer.

  • Use clientInboundChannel() to intercept messages coming from clients.
  • Use clientOutboundChannel() to intercept messages going to clients.

This allows fine-grained control over message flow.

Common Use Cases

Interceptors are powerful for many scenarios:

  • Authentication & Authorization: Validate users before connection or message delivery.
  • Logging: Track connection events and message traffic.
  • Session Management: Attach user-specific data to WebSocket sessions.
  • Message Modification: Add headers, filter content, or transform payloads.
  • Rate Limiting: Prevent abuse by limiting message frequency.

Interceptor Knowledge Check

You've learned about two main types of WebSocket interceptors in Spring. Let's see if you can distinguish their primary use cases.

Interceptors: Your WebSocket Control

Today, you learned about Spring's WebSocket Interceptors, powerful tools for controlling and observing your real-time communication.

  • Handshake Interceptors: For pre-connection logic.
  • Channel Interceptors: For STOMP message flow.

They are essential for building secure, robust, and observable WebSocket applications. Next, we'll explore message converter customization!

คำถามที่พบบ่อย

บทเรียน “ตัวดักจับ WebSocket” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวดักจับ WebSocket” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส WebSockets & Real-Time Systems with Spring ให้อัปเกรดเป็น CoddyKit PRO คอร์ส WebSockets & Real-Time Systems with Spring มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวดักจับ WebSocket”

ใช้ตัวดักจับ WebSocket เพื่อประมวลผลข้อความและเหตุการณ์การเชื่อมต่อล่วงหน้าและภายหลัง คุณปฏิบัติ WebSockets & Real-Time Systems with Spring ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน WebSockets & Real-Time Systems with Spring หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน WebSockets & Real-Time Systems with Spring บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวดักจับ WebSocket” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน WebSockets & Real-Time Systems with Spring นี้ได้ไหม

ได้ บทเรียน WebSockets & Real-Time Systems with Spring ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวดักจับ WebSocket
  2. การปรับแต่งตัวแปลงข้อความ
  3. การจัดการเซสชันผู้ใช้
  4. การส่งข้อความเฉพาะเจาะจงถึงผู้ใช้
← กลับไปที่ WebSockets & Real-Time Systems with Spring