2017-04-21 116 views
1

我已根据堆栈溢出跟踪Quetion1Quetion2,以根据会话标识发送消息给特定客户端,但无法找到成功消息。春季会议+春季网络插座。根据会话ID向特定客户端发送消息

下面是我的样品RestController类

@RestController 
public class SpringSessionTestApi { 

@Autowired 
public SimpMessageSendingOperations messagingTemplate; 

@MessageMapping("/messages") 
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception { 

    String sessionId = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID"); 
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId)); 

    } 

private MessageHeaders createHeaders(String sessionId) { 
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE); 
    headerAccessor.setSessionId(sessionId); 
    headerAccessor.setLeaveMutable(true); 
    return headerAccessor.getMessageHeaders(); 
    } 
} 

会话ID:当客户端发送了createSession请求,新的弹簧的sessionId产生并同样被储存在MongoDB的为好。之后,当客户端发送Web套接字连接请求时,会收到相同的sessionId,并按预期存储在mongoDb中。直到这一切工作正常。

现在我的工作是根据sessionId将响应发送回客户端。 对于我有以下的网络套接字类:

@Configuration 
@EnableScheduling 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends 
    AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> { 

@Override 
protected void configureStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/messages"); 
} 

public void configureMessageBroker(MessageBrokerRegistry registry) { 
    registry.enableSimpleBroker("/queue"); 
    registry.setApplicationDestinationPrefixes("/app"); 
    } 
} 

和我使用的连接样本客户端代码:

function connect() { 

stompClient = Stomp.client('ws://localhost:8016/messages'); 
stompClient.debug = null; 

stompClient.connect({}, function (frame) { 
    setConnected(true); 
    console.log('Connected: ' + frame); 
    stompClient.subscribe('/user/queue/test', function (greeting) { 
     console.log("Hello "+greeting); 
     console.log("Greeting body "+JSON.parse(greeting.body)); 

    }); 
}); 
} 

请帮帮忙,我哪里做错了在这? 在此先感谢!

+0

我只看到配置,看不到应该向用户发送响应的类 – Sarief

+0

@Sarief据我所知,“convertAndSendToUser()”方法会向特定用户发送响应。对不起,我不明白你在问什么? – Akshada

+0

hm。没有看到它。你需要使用用户名,而不是会话ID。它使用spring安全并通过Authority.class的用户名查找用户。这就是说,你的用户坚持春季安全吗? – Sarief

回答

0

如果您正在使用/ user频道,请尝试按照here的规定传递用户。

@MessageMapping("/messages") 
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal) 
    throws Exception { 
    messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message); 
} 
+0

thanx你的答复。我认为principal.getName()会为我提供在认证过程中由spring security设置的用户名。在我的情况下,没有认证。我只是想根据它通过headerAccessor.getSessionAttributes()。get(“SPRING.SESSION.ID”)获得的sessionId来回复客户端。 – Akshada