繁体   English   中英

使用Spring websockets定制Stomp Headers

[英]Custom Stomp Headers using Spring websockets

我有一个基本的spring websocket应用程序,它目前向订阅者发送基本数据。 目前,系统使用SimpMessageSendingOperations类作为消息处理程序。 如果我调用SimpMessageSendingOperations.convertAndSend(destination, object)则订阅的客户端将转换和接收该对象。

我希望能够向客户端发送自定义标头。 我尝试使用SimpMessageSendingOperations.convertAndSend(destination, object, headers)方法来执行此操作。 但是,自定义标头不包含在stomp消息中。

通过代码调试它看起来像StompHeaderAccessor.toStompHeaderMap()方法调用toNativeHeaderMap() ,它使用本toNativeHeaderMap()和原始本toNativeHeaderMap()映射来构建stomp头。

有没有办法将自定义标头添加到stomp消息?

StompHeaderAccessor扩展了NativeMessageHeaderAccessor,它似乎是非stomp标头所在的位置,除了它们都存储在名为nativeHeaders的单个标头中 - 它本身就是一个映射。

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public  GenericMessage<Greeting> greeting(HelloMessage message) throws Exception {      
    Map<String, List<String>> nativeHeaders = new HashMap<>();
    nativeHeaders.put("hello", Collections.singletonList("world"));

    Map<String,Object> headers = new HashMap<>();
    headers.put(NativeMessageHeaderAccessor.NATIVE_HEADERS, nativeHeaders);

    return new GenericMessage<Greeting>(new Greeting("Hello, " + message.getName() + "!"), headers);
}

用于将自定义标头包装到nativeHeaders标头的简单拦截器服务器端应足以在客户端公开它们作为映射message.headers.nativeHeaders的位置。 同样地,您可以编写一个客户端拦截器来将nativeHeaders移动到常规头中 - 因此在您的客户端知道该消息之前,所有预期的头文件都只是在message.headers中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM