WebSockets en realtime systemen met Spring · Les

Gebruikerssessies beheren

Implementeer geavanceerd sessiebeheer voor WebSockets door HTTP-sessies aan WebSocket-sessies te koppelen.

Les 3 van 411 stappen

Gebruikerssessies beheren is een gratis WebSockets en realtime systemen met Spring-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject WebSockets en realtime systemen met Spring. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus WebSockets en realtime systemen met Spring bevat in totaal 4 lessen.

Gebruikerssessies begrijpen

In webtoepassingen helpt een "sessie" een server om een gebruiker tijdens meerdere aanvragen te onthouden. Het is als tijdelijk geheugen voor elke gebruiker.

Bij traditioneel HTTP worden sessies vaak beheerd met cookies. Hiermee kun je gebruikersspecifieke gegevens, zoals de aanmeldstatus of items in een winkelmandje, tussen het laden van pagina's bewaren.

WebSockets: uitdagingen rond sessies

In tegenstelling tot HTTP brengen WebSockets een permanente, full-duplexverbinding tot stand. Deze verbinding bevat niet automatisch dezelfde sessiecontext als een HTTP-aanvraag.

Dit betekent dat een WebSocket-verbinding niet automatisch weet wie de gebruiker is wanneer die gebruiker zich via HTTP aanmeldt en daarna een WebSocket opent, tenzij je dit specifiek instelt.

  • HTTP-sessie: kortdurend, aanvraag-antwoord.
  • WebSocket-sessie: langdurige, permanente verbinding.

HTTP- en WebSocket-sessies verbinden

Om uitgebreide realtime toepassingen te bouwen, moet de WebSocket-verbinding vaak toegang hebben tot de context van de HTTP-sessie van de gebruiker.

Je wilt bijvoorbeeld weten of een gebruiker is geauthenticeerd, wat diens gebruikers-ID is of welke andere profielgegevens tijdens de eerste HTTP-aanmelding zijn ingesteld.

Spring biedt mechanismen om deze kloof tijdens de WebSocket-handshake te overbruggen.

De handshake-interceptor

Het belangrijkste hulpmiddel van Spring om HTTP- en WebSocket-sessies aan elkaar te koppelen is HttpSessionHandshakeInterceptor.

Deze interceptor wordt uitgevoerd tijdens de WebSocket-handshake: de eerste HTTP-aanvraag die wordt opgewaardeerd naar een WebSocket-verbinding. De interceptor kan attributen uit de huidige HTTP-sessie naar de WebSocket-sessie kopiëren.

  • Wat de interceptor doet: HTTP-sessieattributen kopiëren.
  • Wanneer de interceptor wordt uitgevoerd: tijdens de WebSocket-handshake.

De sessie-interceptor configureren

Om HttpSessionHandshakeInterceptor te gebruiken, moet je deze registreren in je WebSocket-configuratie. Hiermee geef je Spring opdracht de interceptor toe te passen wanneer een WebSocket-verbinding tot stand wordt gebracht.

Je voegt de interceptor doorgaans toe in je implementatie van WebSocketMessageBrokerConfigurer:

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws")
            .addInterceptors(new HttpSessionHandshakeInterceptor())
            .withSockJS();
  }
}

Gekoppelde sessiegegevens gebruiken

Nadat HttpSessionHandshakeInterceptor zijn taak heeft uitgevoerd, kun je de gekopieerde HTTP-sessieattributen gebruiken in je WebSocket-berichthandlers.

Vaak wil je toegang tot Principal (de geauthenticeerde gebruiker) of tot andere aangepaste attributen die je in de HTTP-sessie hebt opgeslagen.

@Controller
public class MyWebSocketController {
  @MessageMapping("/hello")
  public void handleMessage(@Payload String message, Principal principal) {
    String username = principal.getName();
    System.out.println("Message from " + username + ": " + message);
    // ... use username for user-specific logic
  }
}

WebSocket-specifieke gegevens

Naast het kopiëren van HTTP-sessiegegevens kun je ook rechtstreeks informatie opslaan in de WebSocketSession zelf. Deze gegevens zijn specifiek voor die ene WebSocket-verbinding.

Dit is handig voor het beheren van verbindingsspecifieke statussen, zoals de huidige chatruimte van een gebruiker, meldingsvoorkeuren voor deze verbinding of andere tijdelijke gegevens.

@EventListener
public void handleSessionConnect(SessionConnectedEvent event) {
  StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
  WebSocketSession session = (WebSocketSession) accessor.getSessionAttributes().get("webSocketSession");
  if (session != null) {
    session.getAttributes().put("customKey", "customValue");
  }
  System.out.println("User connected: " + accessor.getUser().getName());
}

De levenscyclus van sessies beheren

Met Spring kun je luisteren naar gebeurtenissen in de levenscyclus van WebSocket-sessies. Dit is essentieel voor het opruimen van bronnen of het bijwerken van de gebruikersstatus wanneer verbindingen tot stand komen of worden gesloten.

Je kunt @EventListener gebruiken met SessionConnectedEvent en SessionDisconnectEvent om op deze wijzigingen te reageren.

  • SessionConnectedEvent: wordt geactiveerd wanneer een nieuwe STOMP-sessie tot stand komt.
  • SessionDisconnectEvent: wordt geactiveerd wanneer een STOMP-sessie wordt gesloten.

Uitvoerbaar: handshake-interceptor

Dit Spring Boot-voorbeeld configureert een WebSocket-eindpunt met HttpSessionHandshakeInterceptor. Wanneer een client verbinding maakt, helpt de interceptor de HTTP-sessie (indien aanwezig) aan de WebSocket-sessie te koppelen.

We laten een eenvoudige berichtenhandler zien die toegang zou kunnen hebben tot de Principal van de geauthenticeerde gebruiker. Als Spring Security was ingeschakeld, zou principal.getName() de gebruikersnaam van de aangemelde gebruiker retourneren.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.security.Principal;

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

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
      registry.addEndpoint("/ws")
              .addInterceptors(new HttpSessionHandshakeInterceptor())
              .withSockJS();
    }
  }

  @Controller
  public static class WebSocketGreetingController {
    @MessageMapping("/hello")
    public void greeting(Principal principal) {
      if (principal != null) {
        System.out.println("Message from authenticated user: " + principal.getName());
      } else {
        System.out.println("Message from unauthenticated user (Principal is null).");
      }
    }
  }
}

Snelle controle: handshake-interceptor

Toets je begrip van HttpSessionHandshakeInterceptor.

Samenvatting: sessiebeheer

We hebben onderzocht hoe je gebruikerssessies beheert in Spring WebSocket-toepassingen, en vooral hoe je HTTP-sessiecontext aan WebSocket-sessies koppelt.

  • HttpSessionHandshakeInterceptor is essentieel voor het kopiëren van HTTP-sessieattributen tijdens de handshake.
  • Je kunt gegevens van geauthenticeerde gebruikers (Principal) gebruiken in WebSocket-handlers.
  • @EventListener helpt bij het beheren van gebeurtenissen rond het verbinden en verbreken van verbindingen.

Goed sessiebeheer zorgt ervoor dat je realtimefuncties voor elke gebruiker gepersonaliseerd en veilig zijn.

Gratis beginnen

Leer WebSockets en realtime systemen met Spring met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
12
Lessen
48

Veelgestelde vragen

Is de les “Gebruikerssessies beheren” gratis?

Ja — de volledige tekst van “Gebruikerssessies beheren” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus WebSockets en realtime systemen met Spring wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus WebSockets en realtime systemen met Spring bevat in totaal 4 lessen.

Wat leer ik in “Gebruikerssessies beheren”?

Implementeer geavanceerd sessiebeheer voor WebSockets door HTTP-sessies aan WebSocket-sessies te koppelen. Je oefent met WebSockets en realtime systemen met Spring door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met WebSockets en realtime systemen met Spring te beginnen?

Ervaring vooraf is niet nodig. WebSockets en realtime systemen met Spring op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Gebruikerssessies beheren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over WebSockets en realtime systemen met Spring?

Ja. Elke les over WebSockets en realtime systemen met Spring bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. WebSocket-interceptors
  2. Berichtconverters aanpassen
  3. Gebruikerssessies beheren
  4. Gerichte messaging aan specifieke gebruikers
← Terug naar WebSockets en realtime systemen met Spring