春季会议+春季网络插座。根据会话ID向特定客户端发送消息
我已根据堆栈溢出跟踪Quetion1和Quetion2,以根据会话标识发送消息给特定客户端,但无法找到成功消息。春季会议+春季网络插座。根据会话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));
});
});
}
请帮帮忙,我哪里做错了在这? 在此先感谢!
如果您正在使用/ user频道,请尝试按照here的规定传递用户。
@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal)
throws Exception {
messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message);
}
thanx你的答复。我认为principal.getName()会为我提供在认证过程中由spring security设置的用户名。在我的情况下,没有认证。我只是想根据它通过headerAccessor.getSessionAttributes()。get(“SPRING.SESSION.ID”)获得的sessionId来回复客户端。 – Akshada
我在git中找到了一个完整可行的Spring Stomp Chat项目,链接在这里。你可以参考它。 https://gist.github.com/theotherian/9906304
@ Xmagic-谢谢。 – Akshada
我只看到配置,看不到应该向用户发送响应的类 – Sarief
@Sarief据我所知,“convertAndSendToUser()”方法会向特定用户发送响应。对不起,我不明白你在问什么? – Akshada
hm。没有看到它。你需要使用用户名,而不是会话ID。它使用spring安全并通过Authority.class的用户名查找用户。这就是说,你的用户坚持春季安全吗? – Sarief