WebSocket Stomp поверх SockJS - настраиваемые заголовки HTTP
Я использую stomp.js через SockJS в своем javascript-клиенте.
Я подключаюсь к websocket, используя
stompClient.connect({}, function (frame) {
stomp через соединение sockJS имеет 2 запроса http:
- запрос /info
- запрос на обновление HTTP
клиент отправляет все файлы cookie. Я также хотел бы отправить специальные заголовки (например, заголовок XSRF), но не нашел способа сделать это. Поймите любую помощь.
Ответы
Ответ 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