Я использовал пружинную веб-розетку для отправки уведомления пользователю через:
messagingTemplate.convertAndSendToUser(
username,
"/queue/notify",
nbNotification
);
return;
У меня был успешный тест на локальное отправленное сообщение пользователю, если пользователь авторизуется в нескольких браузерах, поэтому все сеансы будут получать массаж.
Но когда я развернул приложение на сервере Ubuntu, я увидел, что только один сеанс может получить сообщение, но не весь сеанс.
Я не знаю, где первопричина, чтобы решить эту проблему.Ниже моя кодировка:
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/wsapp");
registry.enableSimpleBroker("/queue", "/user", "/topic");
registry.setUserDestinationPrefix("/user");
}
Обработка входящего канала для добавления аутентификации пользователя при подключении через веб-сокет:
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(new ChannelInterceptorAdapter() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor =
MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
try {
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
Thread.sleep(2000);
String jwtToken = accessor.getFirstNativeHeader("authorization");
System.out.println("open socket with token " + jwtToken);
if (jwtToken != null) {
String username = jwtService.getUsernameFromToken(jwtToken);
if (username != null) {
User u = userService.findUserByName(username);
if (u == null){
System.out.println("Token not valid with username " + username);
return null;
}
UserDetails userDetail = new org.springframework.security.core.userdetails.User(u.getUsername(), u.getPassword(), true, true,
true, true, u.getAuthorities());
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetail,
null, userDetail.getAuthorities());
accessor.setUser(authentication);
System.out.println("Initiated new socket for user " + u.getUsername() + " with session " + accessor.getSessionId());
} else {
return null;
}
} else {
return null;
}
}else if (StompCommand.SUBSCRIBE.equals(accessor.getCommand())){
}
}catch (Exception e){
System.out.println("ERROR in connect socket " + e.getMessage());
return null;
}
return message;
}
});
}