spring - example - WebSocket Stomp sobre SockJS-cabeceras personalizadas http
websocket spring boot angular 4 (3)
@Rohitdev Así que, básicamente, no puedes enviar ningún encabezado HTTP usando stompClient, porque STOMP está sobre capas websockets, y solo cuando ocurre el handshake de websockets tenemos la posibilidad de enviar encabezados personalizados. Entonces, solo SockJS puede enviar estos encabezados, pero por alguna razón no hagas esto: https://github.com/sockjs/sockjs-client/issues/196
Estoy usando stomp.js sobre SockJS en mi cliente de JavaScript. Me estoy conectando a websocket usando
stompClient.connect({}, function (frame) {
pisa fuerte sobre la conexión sockJS tiene 2 solicitudes http:
- solicitud a / info
- solicitud de actualización http
el cliente envía todas las cookies También me gustaría enviar encabezados personalizados (por ejemplo, encabezado XSRF) pero no encontré la manera de hacerlo. Apreciará cualquier ayuda.
De http://jmesnil.net/stomp-websocket/doc/
stompClient.connect (encabezados, connectCallback, errorCallback);
donde donde el encabezado es un mapa que contiene encabezados HTTP personalizados
Encabezados personalizados:
stompClient.connect({token: "ABC123"}, function(frame) { ... code ...});
Sin encabezados personalizados:
stompClient.connect({}, function(frame) { ... code ...});
En Javascript, puedes extraer un encabezado STOMP usando:
username = frame.headers[''user-name''];
En el lado del servidor, si está utilizando Spring Framework, puede implementar un Interceptor para copiar los parámetros HTTP a los encabezados STOMP de 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");
}
...
}
}
Y para enviar mensajes sin parámetros 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}));
}
y aquí está pasando parámetros a los encabezados 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}));
}