2016-04-14 10 views
0

Ich habe ein Problem, wenn ich versuche, eine Nachricht von Client zu Server auf Spring WebSocket zu senden. Ich habe Konfiguration Websocket auf dem Server und @Message auf dem Controller erstellen. Ich sende Daten vom Client über Javascript. Es nur manchmal funktionieren, aber es manchmal nicht und die Nachricht auf Server werfen: MissingSessionUserException: Nein "user" Header in NachrichtSpring Websocket MissingSessionUserException: Keine "Benutzer" -Kopfzeile in der Nachricht

Here're mein 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("/"); 
    } 
} 

Here're mein 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")); 
     } 
    } 
} 

Here're mein Javascript-Code Backbone.js:

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

Here're mein Server-Fehlerprotokoll:

[2016 Apr 14 - 02:13:19] ERROR: [org.springframework.web.socket.messaging.WebSocketAnnotationMethodMessageHandler] - 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:42) at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:139) at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:108) at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:490) at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:497) at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:87) at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:451) at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:389) at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135) at 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)

Antwort

3

Sie versuchen, zu einem user destination so dem Benutzer zu abonnieren, authentifiziert werden muss.

Wenn das ein anonymer Benutzer ist, der das Thema abonnieren möchte, hilft answer to this question.

Sie werden ein anonymer dem Benutzer zuweisen identifizieren, und es gibt zwei Möglichkeiten:

  1. Konfigurieren einer Unterklasse von DefaultHandshakeHandler die determineUser und ordnet jedem WebSocketSession eine Art von Identität außer Kraft setzt.

  2. Die WebSocket-Sitzung greift auf den von HttpServletRequest.getUserPrincipal für die Handshake-HTTP-Anforderung zurückgegebenen Wert zurück. Sie könnten einen Servlet-Filter haben, der die HttpServletRequest umschließt und entscheidet, was von dieser Methode zurückgegeben wird. Oder wenn Sie Spring Security mit dem AnonymousAuthenticationFilter verwenden, überschreiben Sie die Methode createAuthentication.

+1

Vielen Dank für Ihren Kommentar @Stanley. Ich habe meine Probleme vor langer Zeit gelöst und es ist das gleiche mit Ihnen Vorschlag. Es wird für andere wie mich hilfreich sein. In der Vergangenheit habe ich Header im Netzwerk überprüft, bevor der Client an den Server sendet, dann sehe ich fehlende Benutzerauthentifizierung. Danach füge ich einfach die Benutzerauthentifizierung hinzu, bevor der Client zum Server sendet, und es funktioniert einwandfrei. –