2016-08-02 3 views
2

Сегодня я проверил пару часов для внедрения или учебного пособия в том, как отслеживать соединения с веб-серверами весной.Websocket отслеживает соединения весной

Я сделал (очень хороший) учебник по весне о веб-сайтах и ​​STOMP. here

Итак, какая у меня настройка, у меня есть приложение Ionic Hybrid с поддержкой Spring, и я хочу отправить уведомление клиенту всякий раз, когда в бэкэнд возникает новое событие уведомления. Весь этот код уже реализован, и соединение работает, но сейчас нет способа указать, к каким уведомлениям нужно перейти.

Нет учебника или объяснений по этому вопросу, которое следует за структурой в учебнике Spring (по крайней мере, не после 5 часов исследований), и я немного ошеломлен всей информацией о веб-сайтах и ​​безопасности в Интернете. (Я узнал о веб-сайтах всего за 2 дня)

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

Я нашел this unanswered question на StackOverflow о тех же проблемах, что и у меня, поэтому я уверен, что эти вопросы докажут, что это стоит того.

TL; DR

Как реализовать список в интерфейсе, который отслеживает соединения на основе Spring WebSocket Tutorial?

Как отправить данные от клиента на бэкэнд при установлении соединения? (например, идентификатор пользователя или токен)

+0

Вы действительно потратили время на чтение [Справочного руководства] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-server-handshake)? –

+0

Я сделал это, и, как я уже сказал, это было потрясающе, поэтому я думаю, что простой и универсальный ответ может быть очень полезным для таких новых учеников, как я. – Sytham

ответ

1

Итак, я понял это сам.

Моих уведомлений имеют идентификатор получателя (идентификатор пользователя, когда уведомления должны быть отправить)

Так что я собираюсь отправить «/ WS-пользователю /» + ID + «/ приветствия», где id является пользователем, который вошёл в систему.

На клиентов это довольно легко достичь.

var stompClient = null; 

    // init 
    function init() { 
      /** 
      * Note that you need to specify your ip somewhere globally 
      **/ 
     var socket = new SockJS('http://127.0.0.1:9080/ws-notification'); 
     stompClient = Stomp.over(socket); 
     stompClient.connect({}, function(frame) { 
      console.log('Connected: ' + frame); 
      /** 
      * This is where I get the id of the logged in user 
      **/ 
      barService.currentBarAccountStore.getValue().then(function (barAccount) { 
       subscribeWithId(stompClient,barAccount.user.id); 
      }); 
     }); 
    } 

      /** 
      * subscribe at the url with the userid 
      **/ 
    function subscribeWithId(stompClient,id){ 
     stompClient.subscribe('/ws-user/'+id+'/greetings', function(){ 
      showNotify(); 
     }); 
    } 
      /** 
      * Broadcast over the rootscope to update the angular view 
      **/ 
    function showNotify(){ 
     $rootScope.$broadcast('new-notification'); 
    } 

    function disconnect() { 
     if (stompClient != null) { 
      stompClient.disconnect(); 
     } 
     // setConnected(false); 
     console.log("Disconnected"); 
    } 

Далее мы добавим «setUserDestinationPrefix» в MessageBrokerRegistry в классе WebSocketConfig.java:

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    private final static String userDestinationPrefix = "/ws-user/"; 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config){ 
     config.enableSimpleBroker("/ws-topic","/ws-user"); 
     config.setApplicationDestinationPrefixes("/ws-app"); 
     config.setUserDestinationPrefix(userDestinationPrefix); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/ws-notification").setAllowedOrigins("*").withSockJS(); 
    } 
} 

Обратите внимание, что я использую внутренний RestTemplate вызовы для доступа к моей controllermethod, который посылает уведомление подписанный клиент.Это делается с помощью Consumer Event класс (попросите, чтобы увидеть код, это просто, чтобы вызвать функцию контроллера, можно было бы сделать по-другому)

@RequestMapping(value = "/test-notification", method = RequestMethod.POST) 
public void testNotification(@RequestBody String recipientId) throws InterruptedException { 
    this.template.convertAndSendToUser(recipientId,"/greetings", new Notify("ALERT: There is a new notification for you!")); 
} 

Пожалуйста, ознакомьтесь мой код и предупредить меня, если вы видите какие-либо вопросы и/или проблемы безопасности ,

+0

Можете ли вы поделиться кодом? как вы знаете, какой сокет использовать для отправки сообщения клиенту? –

0

Для пользовательской доставки в websocket вы можете использовать объекты Principle с гарантией пружины. Вот хороший пример реализован:

https://github.com/rstoyanchev/spring-websocket-portfolio

Весна безопасность будет проверять Same Origin и от вашего клиента вы можете отправить заголовок с педалью эффектов используются идентификатором указанного.

Надеюсь, это может вам помочь.

Смежные вопросы