Rename header for "orig" destination

The UserDestinationMessageHandler adds a header providing a hint for
what the original destination a user may have used when subscribing.
That is then used when writing messages back to WebSocket clients to
ensure they dont see the internally used, transformed user destination.

This change moves the header name constatn to make it more broadly
applicable. For example SPR-11645.
This commit is contained in:
Rossen Stoyanchev 2014-04-04 14:31:49 -04:00
parent ec0b672baa
commit 5e925ac03c
5 changed files with 33 additions and 6 deletions

View File

@ -52,6 +52,16 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor {
public static final String USER_HEADER = "simpUser";
/**
* For internal use.
*
* <p>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<String, Object> getSessionAttributes() {
return (Map<String, Object>) 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);
}

View File

@ -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) {

View File

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

View File

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

View File

@ -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<byte[]> message = MessageBuilder.withPayload(new byte[0]).setHeaders(headers).build();
this.protocolHandler.handleMessageToClient(this.session, message);