8


spring-websocket と spring-messaging (バージョン 4.2.2.RELEASE) を使用して、完全な機能を備えたブローカー (Apache ActiveMQ 5.10.0) を使用して websocket に STOMP を実装しています。
私のクライアントは、宛先のみにサブスクライブすることを意図しています。つまり、メッセージを送信できないはずです。さらに、クライアントがサブスクライブできる宛先をより厳密に制御したいと考えています。どちらの場合でも(つまり、クライアントがメッセージを送信しようとしたり、無効な宛先にサブスクライブしようとしたりする場合)、できるようにしたいと思います

  1. 適切なエラーを送信する、および/または
  2. ウェブソケットを閉じる

すべての宛先が ActiveMQ に転送されることに注意してください。インバウンド チャネルにChannelInterceptorを実装できると思ったのですが、API を見ると、目的を達成する方法がわかりません。これは可能ですか?クライアントのリクエストを検証する最善の方法は何ですか? 私の websocket 構成は以下のとおりです。

<websocket:message-broker
    application-destination-prefix="/app">
    <websocket:stomp-endpoint path="/pushchannel"/>
    <websocket:stomp-broker-relay relay-host="localhost"
        relay-port="61613" prefix="/topic"
        heartbeat-receive-interval="300000" heartbeat-send-interval="300000" />
    <websocket:client-inbound-channel>
        <websocket:interceptors>
            <bean class="MyClientMessageInterceptor"/>
        </websocket:interceptors>
    </websocket:client-inbound-channel>
</websocket:message-broker>
4

1 に答える 1

0

インバウンド インターセプターを作成し、適切なエラー メッセージをクライアントに送信できます。

public class ClientInboundChannelInterceptor extends ChannelInterceptorAdapter {

@Autowired
private SimpMessagingTemplate simpMessagingTemplate;

@Override
public Message<?> preSend(Message message, MessageChannel channel) throws IllegalArgumentException{
    StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message);
    logger.debug("logging command " + headerAccessor.getCommand());
    try {
          //write your logic here
        } catch (Exception e){
            throw new MyCustomException();
        }
    }

}

アップデート:

1) から例外をスローすると、フレームClientInboundChannelInterceptorとして送信されERRORます。特に何もする必要はありません。

2)接続を閉じることについてはわかりませんが、DISCONNECTヘッダーを作成して送信するなどのことを行うとうまくいくはずです(これをテストして回答を更新しようとします)。

SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.DISCONNECT);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);

template.convertAndSendToUser(destination,new HashMap<>(),headerAccessor.getMessageHeaders());

サブスクライブ中にエラーを送信するには、次のいずれかのオプションがあります。

1) から例外をスローしますClientInboundChannelInterceptor

2)で、フレームHandler/Controllerを追加@SubscribeMappingして返します。

@SubscribeMapping("your destination")
public ConnectMessage handleSubscriptions(@DestinationVariable String userID, org.springframework.messaging.Message message){
    // this is my custom class
    ConnectMessage frame= new ConnectMessage();
    // write your logic here
    return frame;
}

frameクライアントに直接送信されます。

于 2016-03-05T20:36:28.923 に答える