Подтвердить что ты не робот

WebSocket Stomp поверх SockJS - настраиваемые заголовки HTTP

Я использую stomp.js через SockJS в своем javascript-клиенте. Я подключаюсь к websocket, используя

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

stomp через соединение sockJS имеет 2 запроса http:

  • запрос /info
  • запрос на обновление HTTP

клиент отправляет все файлы cookie. Я также хотел бы отправить специальные заголовки (например, заголовок XSRF), но не нашел способа сделать это. Поймите любую помощь.

4b9b3361

Ответ 1

@Rohitdev Таким образом, вы не можете отправлять HTTP-заголовки, используя stompClient, потому что STOMP является слоем поверх web-узлов, и только тогда, когда происходит установление рукопожатия с помощью websockets, у нас есть возможность отправлять пользовательские заголовки. Таким образом, только SockJS может отправлять эти заголовки, но по некоторым причинам не делает этого: https://github.com/sockjs/sockjs-client/issues/196

Ответ 2

Пользовательские заголовки:

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

Без пользовательских заголовков:

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

В Javascript вы можете извлечь заголовок STOMP, используя:

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

На стороне сервера, если вы используете Spring Framework, вы можете реализовать перехватчик для копирования панелей HTTP в заголовки STOMP в WebSockets.

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}));

}

Ответ 3

Из http://jmesnil.net/stomp-websocket/doc/

stompClient.connect(заголовки, connectCallback, errorCallback);

где заголовок представляет собой карту, содержащую пользовательские заголовки HTTP