8

組み込みのMessage BrokerSTOMP over WebSocketを使用して、Spring 4でリアルタイム通知システムを開発しています。

ユーザー名に従って、特定のユーザーにメッセージを送信できるようにしたいと考えています。この目標を達成するために、次のようにクラスのconvertAndSendToUserメソッドを使用しています。org.springframework.messaging.simp.SimpMessagingTemplate

private final MessagingTemplate messagingTemplate;

@Autowired
public LRTStatusListener(SimpMessagingTemplate messagingTemplate) {
    this.messagingTemplate = messagingTemplate;
}


@Scheduled(fixedDelay=5000)
public void sendMessages(Principal principal)
    messagingTemplate
        .convertAndSendToUser(principal.getName(), "/horray", "Horray, " + principal.getName() + "!");
}

構成として:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/notifications").withSockJS();
    }

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

}

クライアント側 ( JavaScript経由) では、ユーザー名を指定してチャネルにサブスクライブする必要があります (別の非常によく似た質問: Sending message to specific user on Spring Websocket に従って)。

stompClient.subscribe('/user/' + username + '/horray, ...) 

この最後の点は奇妙に聞こえます...

サブスクライブすることにより、webapp でw.whiteとしてログに記録されていると仮定します。

stompClient.subscribe('/user/w.white/horray, ...)

... w.whiteに送信されたメッセージを見ることができます。これは素晴らしいことです...しかし、購読:

stompClient.subscribe('/user/j.pinkman/horray, ...)

...現在 w.white としてログインしているにもかかわらず、j.pinkman送信されたメッセージも表示できます。

この問題を克服する方法はありますか?


アップデート

以下は、WebSocket 経由の接続に関するログです。

Opening Web Socket... 
Web Socket Opened... 
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000

<<< CONNECTED
user-name:w.white
heart-beat:0,0
version:1.1

connected to server undefined
Connected: CONNECTED
version:1.1
heart-beat:0,0
user-name:w.white

>>> SUBSCRIBE
id:sub-0
destination:/topic/lrt

>>> SUBSCRIBE
id:sub-1
destination:/user/lrt
4

2 に答える 2

25

解決策を見つけました。

まず、/userチャネルがすでにSpring STOMPによって管理されていることを知っておくことが重要です。ちなみに、登録は必要ありません。

そう:

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

次に、宛先チャネルを次のように設定します/queue/horray

@Scheduled(fixedDelay=5000)
public void sendMessages(Principal principal)
    messagingTemplate
        .convertAndSendToUser(principal.getName(), "/queue/horray", "Horray, " + principal.getName() + "!");
}

最後に、クライアントで:

stompClient.subscribe('/user/queue/horray', '...');

今、それはうまくいきます!Principalメッセージは、セキュリティ コンテキストによって取得されたに従って、指定された受信者にのみ送信されます。

于 2014-09-03T15:07:42.167 に答える