web-dev-qa-db-ja.com

SockJS上のWebSocket Stomp-httpカスタムヘッダー

私のJavaScriptクライアントでは、SockJSではなくstomp.jsを使用しています。私はを使用してwebsocketに接続しています

stompClient.connect({}, function (frame) {

sockJS接続でのストンプには2つのhttpリクエストがあります。

  1. / infoへのリクエスト
  2. httpアップグレード要求

クライアントはすべてのCookieを送信します。カスタムヘッダー(XSRFヘッダーなど)も送信したいのですが、それを行う方法が見つかりませんでした。どんな助けにも感謝します。

15
user1116377

@Rohitdevつまり、STOMPはWebSocket上のレイヤーであるため、基本的にはstompClientを使用して[〜#〜] http [〜#〜]ヘッダーを送信できません。そして、websocketsハンドシェイクが発生したときにのみ、カスタムヘッダーを送信する可能性があります。したがって、SockJSだけがこのヘッダーを送信できますが、いくつかの理由でこれを行わないでください: https://github.com/sockjs/sockjs-client/issues/196

9
Ruslan

カスタムヘッダー:

stompClient.connect({token: "ABC123"}, function(frame) { ... code ...});

カスタムヘッダーなし:

stompClient.connect({}, function(frame) { ... code ...});

JavaScriptでは、次を使用してSTOMPヘッダーを抽出できます。

  username = frame.headers['user-name'];

サーバー側で、Spring Frameworkを使用している場合は、インターセプターを実装して、HTTPパラメーターをWebSockets STOMPヘッダーにコピーできます。

public class HttpSessionHandshakeInterceptor_personalised implements HandshakeInterceptor {

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


        // Set ip attribute to WebSocket session
        attributes.put("ip", request.getRemoteAddress());

        // ============================================= CODIGO PERSONAL
        ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
        HttpServletRequest httpServletRequest = servletRequest.getServletRequest();
//        httpServletRequest.getCookies();
//        httpServletRequest.getParameter("inquiryId");
//        httpServletRequest.getRemoteUser();

         String token = httpServletRequest.getParameter("token");


      ...
    }
}

STOMPパラメータなしでメッセージを送信する場合:

function sendMessage() {
     var from = document.getElementById('from').value;
     var text = document.getElementById('text').value;
            stompClient.send("/app/chatchannel", {},
               JSON.stringify({'from':from, 'text':text}));
}

ここでは、STOMPヘッダーにパラメーターを渡します。

function sendMessage() {
     var from = document.getElementById('from').value;
     var text = document.getElementById('text').value;
            stompClient.send("/app/chatchannel", {'token':'AA123'},
               JSON.stringify({'from':from, 'text':text}));
}
6
Sergio