Уведомления в реальном времени в весенней загрузке веб-сокета - PullRequest
0 голосов
/ 09 сентября 2018

В моем приложении мне нужно отправлять уведомления в реальном времени конкретному пользователю.Мой WebSocketConfig класс, как показано ниже,

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
        @Override
        public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
            stompEndpointRegistry.addEndpoint("/websocket-example")
                    .withSockJS();
        }

        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            registry.enableSimpleBroker("/topic");
    }
}

Большую часть времени информация будет отправляться на стороне сервера.Поэтому я не установил пункт назначения приложения.

На стороне клиента я подписываюсь на пункт назначения '/ topic / user`,

function connect() {
    var socket = new SockJS('/websocket-example');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/user', function (greeting) {
//            showGreeting(JSON.parse(greeting.body).content);
console.log("Received message through WS");
        });
    });
}

В одном из моих RestController Iесть метод, который передает сообщение всем подключенным клиентам.

    @GetMapping("/test")
    public void test()
    {
        template.convertAndSend("/topic/user", "Hurray");
    }

До этой части все работает нормально.Я получаю сообщение и веду журнал на консоль.

Теперь Если я хочу отправить уведомление только определенным пользователям, я должен использовать template.convertAndSendToUser(String user, String destination, String message).Но я не понимаю, что я должен передать параметру user.Где и когда я получу user?

Я прошел через пару вопросов, связанных с этим, но я не понимаю концепции ясно.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Перед отправкой каких-либо сообщений пользователю необходимо сначала аутентифицировать его на сервере. Есть разные способы сделать это. Spring Security - ключевая фраза здесь

https://docs.spring.io/spring-security/site/docs/current/guides/html5/helloworld-boot.html

Когда аутентификация завершена, вы можете просто получить имя пользователя, позвонив по номеру:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();

https://www.baeldung.com/get-user-in-spring-security

0 голосов
/ 09 сентября 2018

Это username является частью java.security.Principal interface. Каждый объект сеанса StompHeaderAccessor или WebSocket имеет экземпляр этого принципа, и из него можно получить имя пользователя. оно не генерируется автоматически. It has to be generated manually by the server for every session.

Вы можете проверить здесь для получения дополнительной информации о создании уникального идентификатора для каждого сеанса.

тогда используйте вот так:

@MessageMapping('/test')
public void test(SimpMessageHeaderAccessor sha)
{
  String userName = sha.session.principal.name;
  template.convertAndSend(userName, '/topic/user', "Hurray");
}
...