org.springframework.messaging.simp.user

## 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 Summary

    Constructors
    Constructor and Description
    `DefaultUserDestinationResolver(SimpUserRegistry userRegistry)` Create an instance that will access user session id information through the provided registry.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods Deprecated Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected boolean` | `checkDestination(String destination, String requiredPrefix)`
    `String` | `getDestinationPrefix()` Return the configured prefix for user destinations.
    `SimpUserRegistry` | `getSimpUserRegistry()` Return the configured `SimpUserRegistry`.
    `protected String` | `getTargetDestination(String sourceDestination, String actualDestination, String sessionId, String user)` This method determines how to translate the source "user" destination to an actual target destination for the given active user session.
    `boolean` | `isRemoveLeadingSlash()` Whether to remove the leading slash from target destinations.
    `UserDestinationResult` | `resolveDestination(Message<?> message)` Resolve the given message with a user destination to one or more messages with actual destinations, one for each active user session.
    `void` | `setPathMatcher(PathMatcher pathMatcher)` Deprecated. as of 4.3.14 this property is no longer used and is replaced by `setRemoveLeadingSlash(boolean)` that indicates more explicitly whether to keep the leading slash which may or may not be the case regardless of how the `PathMatcher` is configured.
    `void` | `setRemoveLeadingSlash(boolean remove)` Use this property to indicate whether the leading slash from translated user destinations should be removed or not.
    `void` | `setUserDestinationPrefix(String prefix)` The prefix used to identify user destinations.
    `String` | `toString()`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### 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 Detail

    - #### 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

    - #### setPathMatcher

          @Deprecated
          public void setPathMatcher(@Nullable
                                                 PathMatcher pathMatcher)

      Deprecated. as of 4.3.14 this property is no longer used and is replaced by `setRemoveLeadingSlash(boolean)` that indicates more explicitly whether to keep the leading slash which may or may not be the case regardless of how the `PathMatcher` is configured.
      Provide the `PathMatcher` in use for working with destinations which in turn helps to determine whether the leading slash should be kept in actual destinations after removing the `userDestinationPrefix`.

      By default actual destinations have a leading slash, e.g. `/queue/position-updates` which makes sense with brokers that support destinations with slash as separator. When a `PathMatcher` is provided that supports an alternative separator, then resulting destinations won't have a leading slash, e.g. `jms.queue.position-updates`.

      Parameters:
        `pathMatcher` - the PathMatcher used to work with destinations
      Since:
        4.3

    - #### 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`