2016-08-02 115 views
2

今天我搜索了幾個小時的實現或教程,瞭解如何在Spring中跟蹤websocket連接。Websocket跟蹤春天的連接

我已經完成了有關websockets和STOMP的(非常好的)Spring教程。 鏈接here

那麼我的設置是什麼?我有一個Spring後端的Ionic Hybrid應用程序,並且我希望在後端出現新通知事件時向客戶端發送通知。所有這些代碼已經實現並且連接正常,但現在無法指定通知需要去的地方。

在這個問題上沒有關於這個問題的教程或解釋,它遵循Spring教程的結構(至少在5個小時的研究之後),而且我對Web上的所有信息和Web上的安全性有點不知所措。 (我一直在學習websocket只有2天)

因此,對於所有在我之前和將來到我之後,我認爲它可以是非常有用的有一個緊湊和輕量級的答案遵循的結構春季教程。

我發現StackOverflow上的this unanswered question與我有同樣的問題,所以我相信這個問題將證明它是值得的。

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

所以我想出了自己。

我的通知有一個收件人ID(用戶ID在通知需要被髮送到)

所以我要發送到「/ 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類做(問問看代碼,它只是觸發控制器功能,可以做不同的)

@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

春季安全將檢查相同的起源,並從你的客戶,你可以指定使用-ID發送跺腳頭。

希望這可能會幫助你。