diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java index 7af2a47af83..78adf8afbda 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java @@ -52,6 +52,16 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { public static final String USER_HEADER = "simpUser"; + /** + * For internal use. + * + *

The original destination used by a client when subscribing. Such a + * destination may have been modified (e.g. user destinations) on the server + * side. This header provides a hint so messages sent to clients may have + * a destination matching to their original subscription. + */ + public static final String ORIGINAL_DESTINATION = "simpOrigDestination"; + /** * A constructor for creating new message headers. @@ -100,6 +110,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { } } + /** + * @return the message type + */ public SimpMessageType getMessageType() { return (SimpMessageType) getHeader(MESSAGE_TYPE_HEADER); } @@ -109,10 +122,16 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(DESTINATION_HEADER, destination); } + /** + * @return the message destination + */ public String getDestination() { return (String) getHeader(DESTINATION_HEADER); } + /** + * @return the subscription id (if any) of the message + */ public String getSubscriptionId() { return (String) getHeader(SUBSCRIPTION_ID_HEADER); } @@ -121,6 +140,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(SUBSCRIPTION_ID_HEADER, subscriptionId); } + /** + * @return the id of the current session + */ public String getSessionId() { return (String) getHeader(SESSION_ID_HEADER); } @@ -129,6 +151,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(SESSION_ID_HEADER, sessionId); } + /** + * @return attributes associated with the current session. + */ @SuppressWarnings("unchecked") public Map getSessionAttributes() { return (Map) getHeader(SESSION_ATTRIBUTES); @@ -138,6 +163,9 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor { setHeader(SESSION_ATTRIBUTES, attributes); } + /** + * @return the user associated with the current session. + */ public Principal getUser() { return (Principal) getHeader(USER_HEADER); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java index bda6e87a4b8..5d0686789d2 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java @@ -45,8 +45,6 @@ import org.springframework.util.Assert; */ public class UserDestinationMessageHandler implements MessageHandler, SmartLifecycle { - public static final String SUBSCRIBE_DESTINATION = "subscribeDestination"; - private static final Log logger = LogFactory.getLog(UserDestinationMessageHandler.class); @@ -156,7 +154,7 @@ public class UserDestinationMessageHandler implements MessageHandler, SmartLifec } SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(message); if (SimpMessageType.MESSAGE.equals(headerAccessor.getMessageType())) { - headerAccessor.setHeader(SUBSCRIBE_DESTINATION, result.getSubscribeDestination()); + headerAccessor.setHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION, result.getSubscribeDestination()); message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headerAccessor).build(); } for (String targetDestination : destinations) { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java index 717388af0d1..10ff0c9a8dd 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java @@ -96,7 +96,7 @@ public class UserDestinationMessageHandlerTests { assertEquals("/queue/foo-user123", captor.getValue().getHeaders().get(SimpMessageHeaderAccessor.DESTINATION_HEADER)); assertEquals("/user/queue/foo", - captor.getValue().getHeaders().get(UserDestinationMessageHandler.SUBSCRIBE_DESTINATION)); + captor.getValue().getHeaders().get(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION)); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java index b33a91d5f39..352fc145772 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java @@ -33,6 +33,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.SimpMessageType; import org.springframework.messaging.simp.stomp.BufferingStompDecoder; import org.springframework.messaging.simp.stomp.StompCommand; @@ -251,7 +252,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE logger.error("Ignoring message, no subscriptionId header: " + message); return; } - String header = UserDestinationMessageHandler.SUBSCRIBE_DESTINATION; + String header = SimpMessageHeaderAccessor.ORIGINAL_DESTINATION; if (message.getHeaders().containsKey(header)) { headers.setDestination((String) message.getHeaders().get(header)); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java index 426a0599ab4..35fc8d268a9 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java @@ -240,7 +240,7 @@ public class StompSubProtocolHandlerTests { headers.setMessageId("mess0"); headers.setSubscriptionId("sub0"); headers.setDestination("/queue/foo-user123"); - headers.setHeader(UserDestinationMessageHandler.SUBSCRIBE_DESTINATION, "/user/queue/foo"); + headers.setHeader(StompHeaderAccessor.ORIGINAL_DESTINATION, "/user/queue/foo"); Message message = MessageBuilder.withPayload(new byte[0]).setHeaders(headers).build(); this.protocolHandler.handleMessageToClient(this.session, message);