java - Spring Sockjs 中 MissingSessionUser 异常

标签 java spring header stomp spring-websocket

我正在尝试使用 WebSocket 制作一个聊天应用程序。我能够向所有连接的客户端发送消息,现在我尝试向单个用户发送消息。

脚本:

var socket = new SockJS("server endpoint");

订阅:

stompClient.subscribe('/topic/chat', renderMessage);

连接:

stompClient.connect("guest", "guest", connectCallback, errorCallback);

发送地点:

stompClient.send("/app/addMessage", {}, jsonstr);

在我的 spring 配置中:

<websocket:message-broker
        application-destination-prefix="/app">
        <websocket:stomp-endpoint path="/ws">
            <websocket:sockjs />
        </websocket:stomp-endpoint>
        <websocket:simple-broker prefix="/topic" />
        <websocket:client-inbound-channel>
            <websocket:interceptors>
                <bean class="com.websocket.interceptor.ConnectionInterceptor" />
            </websocket:interceptors>
        </websocket:client-inbound-channel>
    </websocket:message-broker>

尝试发送给单个用户的方法:

@MessageMapping("/addMessage")
public void addChatMessage(ChatMessage chatMessage,
        SimpMessageHeaderAccessor headerAccessor,Principal principal) throws Exception {
    chatMessageList.add(chatMessage);
    //trying to output the user but returns null
    System.out.println(headerAccessor.getUser());
    //returns null
    System.out.println(principal.getName());
    //not sending to the current user 
    template.convertAndSendToUser("user", "/topic/chat", chatMessageList);
}

在我的浏览器中,我尝试打开控制台,我可以看到标题是未定义:

connected to server undefined
>>> SUBSCRIBE
id:sub-0
destination:/topic/chat

堆栈跟踪:

Oct 13, 2014 9:53:36 AM org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler processHandlerMethodException
SEVERE: Unhandled exception
org.springframework.messaging.simp.annotation.support.MissingSessionUserException: No "user" header in message
    at org.springframework.messaging.simp.annotation.support.PrincipalMethodArgumentResolver.resolveArgument(PrincipalMethodArgumentResolver.java:43)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:81)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:128)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:97)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:451)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:363)
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:80)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:409)
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:345)
    at org.springframework.messaging.support.ExecutorSubscribableChannel$1.run(ExecutorSubscribableChannel.java:70)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

如何发送给单个用户?如何获取 SimpMessageHeaderAccessor 中的所有 header ?标题实际上是如何工作的?

最佳答案

订阅时需要使用"/user/"前缀来使其被Spring UserDestinationMessageHandler识别。所以代码将是:

stompClient.subscribe('用户/主题/聊天', renderMessage);

参见Spring Websocket user destinations.

关于java - Spring Sockjs 中 MissingSessionUser 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331959/

相关文章:

Java Random setSeed() 不是确定性的

html - 如何阻止我网站的页眉移动?

C++ - include <string> 错误

java - Linux 上的 Protocol Buffer 符号查找错误

Java Swing : Ctrl+F1 does not work globally, 但互为组合键

java - Spring Cloud Feign 客户端重复列表值

java - setCharacterStream 引起的 AbstractMethodError

java - Controller 和 validator 的范围

html - 为每个页面 jsPDF 添加一个固定的页眉/页脚

java - Spring ExceptionHandler 和 Rest 响应的异常