Class DefaultUserDestinationResolver

java.lang.Object
org.springframework.messaging.simp.user.DefaultUserDestinationResolver
All Implemented Interfaces:
UserDestinationResolver

public class DefaultUserDestinationResolver extends Object implements UserDestinationResolver
A default implementation of UserDestinationResolver that relies on a SimpUserRegistry to find active sessions for a user.

When a user attempts to subscribe, e.g. to "/user/queue/position-updates", the "/user" prefix is removed and a unique suffix added based on the session id, e.g. "/queue/position-updates-useri9oqdfzo" to ensure different users can subscribe to the same logical destination without colliding.

When sending to a user, e.g. "/user/{username}/queue/position-updates", the "/user/{username}" prefix is removed and a suffix based on active session id's is added, e.g. "/queue/position-updates-useri9oqdfzo".

Since:
4.0
Author:
Rossen Stoyanchev, Brian Clozel
  • Constructor Details

    • DefaultUserDestinationResolver

      public DefaultUserDestinationResolver(SimpUserRegistry userRegistry)
      Create an instance that will access user session id information through the provided registry.
      Parameters:
      userRegistry - the registry, never null
  • Method Details

    • getSimpUserRegistry

      public SimpUserRegistry getSimpUserRegistry()
      Return the configured SimpUserRegistry.
    • setUserDestinationPrefix

      public void setUserDestinationPrefix(String prefix)
      The prefix used to identify user destinations. Any destinations that do not start with the given prefix are not be resolved.

      The default prefix is "/user/".

      Parameters:
      prefix - the prefix to use
    • getDestinationPrefix

      public String getDestinationPrefix()
      Return the configured prefix for user destinations.
    • setRemoveLeadingSlash

      public void setRemoveLeadingSlash(boolean remove)
      Use this property to indicate whether the leading slash from translated user destinations should be removed or not. This depends on the destination prefixes the message broker is configured with.

      By default this is set to false, i.e. "do not change the target destination", although AbstractMessageBrokerConfiguration may change that to true if the configured destinations do not have a leading slash.

      Parameters:
      remove - whether to remove the leading slash
      Since:
      4.3.14
    • isRemoveLeadingSlash

      public boolean isRemoveLeadingSlash()
      Whether to remove the leading slash from target destinations.
      Since:
      4.3.14
    • resolveDestination

      @Nullable public UserDestinationResult resolveDestination(Message<?> message)
      Description copied from interface: UserDestinationResolver
      Resolve the given message with a user destination to one or more messages with actual destinations, one for each active user session.
      Specified by:
      resolveDestination in interface UserDestinationResolver
      Parameters:
      message - the message to try to resolve
      Returns:
      0 or more target messages (one for each active session), or null if the source message does not contain a user destination.
    • checkDestination

      protected boolean checkDestination(String destination, String requiredPrefix)
    • getTargetDestination

      @Nullable protected String getTargetDestination(String sourceDestination, String actualDestination, String sessionId, @Nullable String user)
      This method determines how to translate the source "user" destination to an actual target destination for the given active user session.
      Parameters:
      sourceDestination - the source destination from the input message.
      actualDestination - a subset of the destination without any user prefix.
      sessionId - the id of an active user session, never null.
      user - the target user, possibly null, e.g if not authenticated.
      Returns:
      a target destination, or null if none
    • toString

      public String toString()
      Overrides:
      toString in class Object