2017-02-10 5 views
0

私はSTOMP 'CREATED'メッセージにカスタムヘッダーを追加しようとしています。このメッセージは、最初の接続時にクライアントによって受信されます。ここでSTOMP JavaScriptを使用してのWebSocketに接続する機能は次のとおりです。
SpringブートアプリケーションのSTOMP CREATEDメッセージにカスタムヘッダーを追加する方法は?

function connect() { 
    socket = new SockJS('/chat'); 
    stompClient = Stomp.over(socket); 
    stompClient.connect('', '', function(frame) { 
     whoami = frame.headers['user-name']; 
     console.log(frame); 
     stompClient.subscribe('/user/queue/messages', function(message) { 
      console.log("MESSAGE RECEIVED:"); 
      console.log(message); 

     showMessage(JSON.parse(message.body)); 
     }); 
     stompClient.subscribe('/topic/active', function(activeMembers) { 
     showActive(activeMembers); 
     }); 
    }); 
    } 

この機能は、ブラウザのコンソールに次のように出力されます

body: "" 
command: "CONNECTED" 
headers: Object 
    heart-beat: "0,0" 
    user-name: "someuser" 
    version: "1.1" 

と私は出力がどのように見える必要がありますので、カスタムヘッダーを追加します:

body: "" 
command: "CONNECTED" 
headers: Object 
    heart-beat: "0,0" 
    user-name: "someuser" 
    version: "1.1" 
    custom-header: "foo" 

Spring Bootアプリケーションでは、次のWebSocket設定があります。

WebSocketConfig.java

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { 

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

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/chat", "/activeUsers") 
      .withSockJS() 
      .setInterceptors(customHttpSessionHandshakeInterceptor()); 
    } 

    ... 

    @Bean 
    public CustomHttpSessionHandshakeInterceptor 
     customHttpSessionHandshakeInterceptor() { 
     return new CustomHttpSessionHandshakeInterceptor(); 

    } 

} 

私は、カスタムヘッダーを設定するには 'HandshakeInterceptor' を登録しようとしたが、それはうまくいきませんでした。ここにCustomHttpSessionHandshakeInterceptor 'です:このアプローチが動作しない理由を

CustomHttpSessionHandshakeInterceptor.java

public class CustomHttpSessionHandshakeInterceptor implements 

HandshakeInterceptor { 

    @Override 
     public boolean beforeHandshake(ServerHttpRequest request, 
     ServerHttpResponse response, 
     WebSocketHandler wsHandler, 
     Map<String, Object> attributes) throws Exception { 
      if (request instanceof ServletServerHttpRequest) { 


       ServletServerHttpRequest servletRequest = 
        (ServletServerHttpRequest) request; 
       attributes.put("custom-header", "foo"); 
      } 
      return true; 
     } 

     public void afterHandshake(ServerHttpRequest request, 
      ServerHttpResponse response, 
      WebSocketHandler wsHandler, 
      Exception ex) { } 
} 

私はhttps://dzone.com/articles/spring-boot-based-websocket
で、このコードスニペットを見つけた誰かが私に説明できますか? Springブートアプリケーションのサーバー側でカスタムヘッダーをSTOMP 'CREATED'メッセージに設定する別の方法はありますか?
ありがとうございます!

答えて

0

このようにしてみましたか? MessageHeaderAccessorにはsetHeaderメソッドもあります。 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-authentication-token-based

+0

はい、i「はMessageHeaderAccessor」を使用しようとしましたが、それはSTOMP「MESSAGE」コマンドを使用して、メッセージのために完璧に動作します(Springのと注釈を付けた方法で処理される通常のメッセージに対して「@MessageMapping」とで「SimpMessagingTemplate」によって送られました私の場合)。質問は、WebSocket接続を確立した後にサーバーによって送信されたSTOMP 'CONNECTED'コマンドでカスタムヘッダーを追加する方法です。 –

0

は、多分それは手遅れだが、決してよりよい遅く...(例えばCONNECTED)

Serverのメッセージは不変で、彼らは変更できないことを意味します。

クライアントのアウトバウンドインターセプタを登録し、preSend(...)メソッドをオーバーライドして接続されたメッセージをトラップし、カスタムヘッダーで新しいメッセージを作成することです。

@Override 
    public Message<?> preSend(Message<?> message, MessageChannel channel) { 

     LOGGER.info("Outbound channel pre send ..."); 

     final StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message); 
     final StompCommand command = headerAccessor.getCommand(); 

     if (!isNull(command)) { 

      switch (command) { 

      case CONNECTED: 
final StompHeaderAccessor accessor = StompHeaderAccessor.create(headerAccessor.getCommand()); 
       accessor.setSessionId(headerAccessor.getSessionId()); 
     @SuppressWarnings("unchecked") 
     final MultiValueMap<String, String> nativeHeaders = (MultiValueMap<String, String>) headerAccessor.getHeader(StompHeaderAccessor.NATIVE_HEADERS); 
     accessor.addNativeHeaders(nativeHeaders); 

// add custom headers 
accessor.addNativeHeader("CUSTOM01", "CUSTOM01"); 

     final Message<?> newMessage = MessageBuilder.createMessage(new byte[0], accessor.getMessageHeaders()); 
       return newMessage; 
      default: 
       break; 
      } 
     } 

     return message; 
    } 
関連する問題