Spring websocket MissingSessionUserException:消息中没有"user"标头

m.n*_*ntt 2 stomp websocket backbone.js spring-websocket

当我尝试在Spring websocket上从客户端向服务器发送消息时,我遇到了问题.我在服务器上配置Websocket并在控制器上创建@Message.我通过javascript从客户端发送数据.它有时会工作,但有时会失败并在服务器上抛出消息:MissingSessionUserException:消息中没有"user"标题

这是我的WebsocketConfig:

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/connectsocket").withSockJS();
    }
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的MessageController:

@RestController
public class MessageController {

    @Autowired
    private SimpMessagingTemplate template;

    @MessageMapping("/websocket/message")
    public synchronized void message(Message<Object> messageObj, 
        WebMessage message, Principal principal) throws Exception {
        if (principal != null) {
            String name = principal.getName();
            template.convertAndSendToUser(name, "/topic/dynamic", new MessagePojo("stage", "value", "message"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的Javascript-backbonejs代码:

app.Models.WebsocketModel = Backbone.Model.extend({
    fetchData : function() {
        console.log("WebsocketModel: fetchData");
        var socket = new SockJS(url + "/connectsocket");
        var client = Stomp.over(socket);

        var onConnect = function(frame) {
            console.log('Connected: ' + frame);
            client.subscribe("/user/topic/dynamic", function(data) {
                var jsonBody = JSON.parse(data.body);
                console.log(jsonBody);
            });
        };

        client.connect({}, onConnect);

        setInterval(function() {
            client.send("/websocket/message", {}, JSON.stringify({
                "message" : "Hello world!!!",
                "toUser" : "Someone"
            }));
        }, 10000);
    }
});
Run Code Online (Sandbox Code Playgroud)

这是我的服务器错误日志:

[2016年4月14日 - 02:13:19]错误:[org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler] - 未处理的异常org.springframework.messaging.simp.annotation.support.MissingSessionUserException:消息中没有"user"标头at org.springframework.messaging org.springframework.messaging. org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch上的org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:108)中的.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:139) (AbstractMethodMessageHandler.java:490)org.springframework.messaging.simp.annotation.support.SimpAnnotationM ethdMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497)org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87)org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler. Java的:451)在org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:389)在org.springframework.messaging.support.ExecutorSubscribableChannel $ SendTask.run(ExecutorSubscribableChannel.java:135)在java.util中.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)

Sta*_*ley 6

您正在尝试订阅用户目标,因此必须对用户进行身份验证.

如果这是一个想要订阅该主题的匿名用户,则回答此问题会有所帮助.

您必须为用户分配匿名身份,并且有两个选项:

  1. 配置DefaultHandshakeHandler该覆盖的子类,determineUser并为每个WebSocketSession分配某种标识.

  2. WebSocket会话将HttpServletRequest.getUserPrincipal依赖于握手HTTP请求返回的值.你可以有一个servlet Filter包装HttpServletRequest并决定从该方法返回什么.或者,如果您正在使用具有AnonymousAuthenticationFilter的Spring Security,请覆盖其createAuthentication方法.