WebSocket Stomp over SockJS - http自定义标头

use*_*377 15 spring stomp websocket sockjs stompjs

我在我的javascript客户端中使用stomp.js而不是SockJS.我正在使用websocket连接

stompClient.connect({}, function (frame) {
Run Code Online (Sandbox Code Playgroud)

stomp over sockJS连接有2个http请求:

  1. 请求/ info
  2. http升级请求

客户端发送所有cookie.我也想发送自定义标头(例如XSRF标头),但没有找到办法做到这一点.将不胜感激任何帮助.

Rus*_*lan 9

@Rohitdev所以基本上你不能使用stompClient 发送任何HTTP头,因为STOMP是基于websockets的层,只有当websockets握手发生时,我们才有可能发送自定义头.因此,只有SockJS可以发送此标头,但由于某些原因不这样做:https://github.com/sockjs/sockjs-client/issues/196


Ser*_*gio 6

自定义标题:

stompClient.connect({token: "ABC123"}, function(frame) { ... code ...});
Run Code Online (Sandbox Code Playgroud)

没有自定义标题:

stompClient.connect({}, function(frame) { ... code ...});
Run Code Online (Sandbox Code Playgroud)

在Javascript中,您可以使用以下方法提取STOMP标头:

  username = frame.headers['user-name'];
Run Code Online (Sandbox Code Playgroud)

在服务器端,如果您使用的是Spring Framework,则可以实现一个Interceptor来将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");


      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

对于不带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}));
}
Run Code Online (Sandbox Code Playgroud)

在这里,您要将参数传递到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}));
}
Run Code Online (Sandbox Code Playgroud)

  • 首先它在弹簧部分不起作用。第二:请参阅@IRus 答案以了解原因 (2认同)
  • 无论我投射 ServerHttpRequest 多少次,我都看不到标头 (2认同)
  • 我确认,弹簧部分不起作用,没有可用的“token”参数 (2认同)