【问题标题】:Spring Boot WebSocket - Adding body to the CONNECT responseSpring Boot WebSocket - 将正文添加到 CONNECT 响应
【发布时间】:2019-05-24 09:44:58
【问题描述】:

我有以下 JS 函数,它们通过 STOMP 连接到 WebSocket,并分别处理 onConnected 事件。

function connect(event) {
    username = document.querySelector('#name').value.trim();

    if(username) {
        usernamePage.classList.add('hidden');
        chatPage.classList.remove('hidden');

        var socket = new SockJS('/ws');
        stompClient = Stomp.over(socket);

        stompClient.connect({}, onConnected, onError);
    }
    event.preventDefault();
}


function onConnected(response) {
    console.log(response);
    // Subscribe to the Public Topic
    stompClient.subscribe('/topic/public', onMessageReceived);

    // Tell your username to the server
    stompClient.send("/app/chat.addUser",
        {},
        JSON.stringify({sender: username, type: 'JOIN'})
    )

    connectingElement.classList.add('hidden');
}

现在函数 onConnected 的第一行,它将以下内容记录到控制台中,这显然看起来像是我可以从服务器端添加更多数据的东西。

{
    command: "CONNECTED",
    headers: { 
        "heart-beat": "0,0",
        version: "1.1"
    },
    body: ""
}

我还有一个HttpHandshakeInterceptor,它实现了HandshakeInterceptor,如下所示。

@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
        Map attributes) throws Exception {
    if (request instanceof ServletServerHttpRequest) {
        ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
        HttpSession session = servletRequest.getServletRequest().getSession();
        attributes.put("sessionId", session.getId());

        ServletServerHttpResponse servletResponse = (ServletServerHttpResponse) response;
        response.getHeaders().set("KEY","VALUE"); // *** I want this either to be in the response header or the body.
    }
    return true;
}

注释以*** 开头的行是我现在正在做的事情,但没有成功。我究竟做错了什么?我什至可以这样做并向客户端获取一些参数吗?如果我做错了,如何以及在哪里做对? (因为现在我开始觉得我在错误的地方尝试这样做)

【问题讨论】:

  • 您可以尝试使用属性而不是响应。或者返回 super
  • @kidnan1991 非常感谢您的建议。我应该从哪里开始?
  • 在你的 beforeHandshake 函数中,如果它不能帮助,请原谅我:)
  • 好的,我去看看...非常感谢您来看看...
  • 关于放入header,可以查看stackoverflow.com/questions/42166472/…

标签: java spring-boot websocket stomp


【解决方案1】:

好的。所以以下是我尝试做的事情,没有成功

public class OutboundMessageInterceptor implements ChannelInterceptor {

    private static final Logger LOGGER = LoggerFactory.getLogger(OutboundMessageInterceptor.class);

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        final StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message);
        final StompCommand command = headerAccessor.getCommand();

        LOGGER.info("Outbound channel preSend (" + command + ")...");

        if (command != null) {

            switch (command) {

                case CONNECTED:
                    final StompHeaderAccessor accessor = StompHeaderAccessor.create(headerAccessor.getCommand());
                    accessor.setSessionId(headerAccessor.getSessionId());
                    @SuppressWarnings("unchecked")
                    final MultiValueMap<String, String> nativeHeaders = (MultiValueMap<String, String>) headerAccessor.getHeader(StompHeaderAccessor.NATIVE_HEADERS);
                    accessor.addNativeHeaders(nativeHeaders);

                    // add custom headers
                    accessor.addNativeHeader("CUSTOM01", "CUSTOM01");

                    return MessageBuilder.createMessage(new byte[0], accessor.getMessageHeaders());
                default:
                    break;
            }
        }

        return message;
    }
}

这基本上是在服务器中拦截出站消息,如果消息是CONNECTED,它将添加一些自定义标头(是的,我最初试图添加正文,但出于测试目的,我坚持使用标题暂时)。

但是这种方法可以拦截许多 STOMP 命令,CONNECTED 除外。我没有尝试拦截其他人,但可能应该有。

然后我再次提到STOMP Protocol Spec(感谢@TimBish 上面的评论)并从那里阅读了此声明。

只有 SEND、MESSAGE 和 ERROR 帧可以有正文。所有其他框架不得有主体。

所以,我们似乎无法拦截除SENDMESSAGEERROR 之外的消息。我认为这是因为遵守 Spring 的 STOMP 实现的协议规范。

为什么我尝试这样做是为了在每个连接的客户端和服务器之间共享一些公共秘密,其中秘密由服务器确定。仍在寻找这样的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2019-07-17
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多