Pencegat WebSocket
Manfaatkan pencegat WebSocket untuk melakukan prapemrosesan dan pascapemrosesan pesan serta peristiwa koneksi.
Pencegat WebSocket adalah pelajaran WebSockets & Real-Time Systems with Spring gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar WebSockets & Real-Time Systems with Spring, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus WebSockets & Real-Time Systems with Spring mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
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!
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pencegat WebSocket” gratis?
Ya — teks lengkap “Pencegat WebSocket” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus WebSockets & Real-Time Systems with Spring, upgrade ke CoddyKit PRO. Kursus WebSockets & Real-Time Systems with Spring mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pencegat WebSocket”?
Manfaatkan pencegat WebSocket untuk melakukan prapemrosesan dan pascapemrosesan pesan serta peristiwa koneksi. Kamu berlatih WebSockets & Real-Time Systems with Spring dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai WebSockets & Real-Time Systems with Spring?
Tidak diperlukan pengalaman sebelumnya. WebSockets & Real-Time Systems with Spring di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Pencegat WebSocket” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran WebSockets & Real-Time Systems with Spring ini?
Ya. Setiap pelajaran WebSockets & Real-Time Systems with Spring menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pencegat WebSocket
- Kustomisasi Pengonversi Pesan
- Pengelolaan Sesi Pengguna
- Pesan Terarah kepada Pengguna Tertentu