весенний websocket не выпускает сообщение для всех пользовательских сессий, если войти в несколько клиентов - PullRequest
0 голосов
/ 01 июля 2019

Я использовал пружинную веб-розетку для отправки уведомления пользователю через:

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