WebSockets og realtidssystemer med Spring · Lektion

WebSocket-interceptorer

Anvend WebSocket-interceptorer til forbehandling og efterbehandling af meddelelser og forbindelseshændelser.

Lektion 1 af 411 trin

WebSocket-interceptorer er en gratis WebSockets og realtidssystemer med Spring-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i WebSockets og realtidssystemer med Spring, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. WebSockets og realtidssystemer med Spring-kurset indeholder 4 lektioner i alt.

Velkommen til interceptorer!

I Spring WebSockets fungerer interceptorer som portvagter eller hændelseslyttere, der kan overvåge og ændre WebSocket-livscyklussen.

De giver dig mulighed for at udføre handlinger som logning, godkendelse eller ændring af data på bestemte tidspunkter under en forbindelse eller udveksling af meddelelser.

Livscykluskroge

Tænk på WebSocket-processen:

  • Håndtryk: Første HTTP-forespørgsel for at opgradere til WebSocket.
  • Forbindelse: WebSocket-forbindelsen oprettes.
  • Udveksling af meddelelser: Data flyder mellem klienten og serveren.
  • Afbrydelse: WebSocket-forbindelsen lukkes.

Interceptorer giver dig mulighed for at »koble dig på« disse trin.

Opsnapning af håndtrykket

HandshakeInterceptor er afgørende for det allerførste trin: WebSocket-håndtrykket.

Den giver dig mulighed for at:

  • Undersøge HTTP-forespørgslen, før WebSocket-forbindelsen oprettes.
  • Udføre kontrol af godkendelse eller adgangstilladelser.
  • Føje attributter til WebSocket-sessionen.

Du kan beslutte, om håndtrykket skal fortsætte.

Kodning af en håndtryksinterceptor

Lad os oprette en enkel HandshakeInterceptor, der logger, når et forbindelsesforsøg begynder og slutter. Det er nyttigt til overvågning eller fejlfinding.

Bemærk metoderne beforeHandshake og afterHandshake.

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());
    }
  }
}

Integration af håndtryksinterceptorer

For at aktivere vores MyHandshakeInterceptor skal vi registrere den i WebSocket-konfigurationen for vores Spring Boot-applikation.

Kør denne kode, og prøv at oprette forbindelse til ws://localhost:8080/ws fra en browsers udviklerkonsol (f.eks. new WebSocket('ws://localhost:8080/ws')) for at se loggene!

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("*");
  }
}

Opsnapning af STOMP-meddelelser

Mens HandshakeInterceptor håndterer indledende forbindelser, fokuserer ChannelInterceptor på STOMP-meddelelser, der flyder gennem Springs meddelelsesbroker.

Disse interceptorer arbejder på meddelelseskanalerne, så du kan undersøge eller ændre meddelelser før de når deres destination, eller efter de er sendt.

Kodning af en kanalinterceptor

En ChannelInterceptor tilbyder metoder som preSend, postSend og afterSendCompletion.

Metoden preSend bruges ofte til at undersøge eller ændre en meddelelse, før den sendes til sin destination (f.eks. et STOMP-emne eller en bruger kø).

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...
}

Integration af kanalinterceptorer

For at registrere en ChannelInterceptor bruger du typisk en konfigurationsklasse, der udvider WebSocketMessageBrokerConfigurer.

  • Brug clientInboundChannel() til at opsnappe meddelelser, der kommer fra klienter.
  • Brug clientOutboundChannel() til at opsnappe meddelelser, der går til klienter.

Det giver detaljeret kontrol over meddelelsesstrømmen.

Almindelige anvendelsesområder

Interceptorer er nyttige i mange scenarier:

  • Godkendelse og adgangstilladelser: Valider brugere før en forbindelse eller levering af en meddelelse.
  • Logning: Spor forbindelseshændelser og meddelelsestrafik.
  • Sessionshåndtering: Knyt brugerspecifikke data til WebSocket-sessioner.
  • Ændring af meddelelser: Tilføj headere, filtrer indhold, eller transformér nyttedata.
  • Hastighedsbegrænsning: Forebyg misbrug ved at begrænse meddelelsesfrekvensen.

Videnstjek om interceptorer

Du har lært om to hovedtyper af WebSocket-interceptorer i Spring. Lad os se, om du kan skelne mellem deres primære anvendelsesområder.

Interceptorer: Din WebSocket-kontrol

I dag har du lært om Springs WebSocket-interceptorer, som er effektive værktøjer til at kontrollere og overvåge din kommunikation i realtid.

  • Håndtryksinterceptorer: Til logik før forbindelsen.
  • Kanalinterceptorer: Til STOMP-meddelelsesstrømmen.

De er afgørende for at bygge sikre, robuste og overvågelige WebSocket-applikationer. Nu skal vi undersøge tilpasning af meddelelseskonvertering!

Gratis at komme i gang

Lær WebSockets og realtidssystemer med Spring med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “WebSocket-interceptorer” gratis?

Ja — hele teksten til “WebSocket-interceptorer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af WebSockets og realtidssystemer med Spring-kurset, skal du opgradere til CoddyKit PRO. WebSockets og realtidssystemer med Spring-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “WebSocket-interceptorer”?

Anvend WebSocket-interceptorer til forbehandling og efterbehandling af meddelelser og forbindelseshændelser. Du øver dig i WebSockets og realtidssystemer med Spring med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på WebSockets og realtidssystemer med Spring?

Der kræves ingen tidligere erfaring. WebSockets og realtidssystemer med Spring på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “WebSocket-interceptorer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne WebSockets og realtidssystemer med Spring-lektion?

Ja. Alle WebSockets og realtidssystemer med Spring-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. WebSocket-interceptorer
  2. Tilpasning af meddelelseskonvertere
  3. Håndtering af brugersessioner
  4. Målrettede meddelelser til bestemte brugere
← Tilbage til WebSockets og realtidssystemer med Spring