You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STOMP协议聊天功能WebSocket连接异常:卡在Opening Web Socket阶段

问题:WebSocket连接停滞在“Opening Web Socket...”阶段,STOMP聊天功能突发故障

我基于STOMP协议实现的聊天功能突然无法正常运行——当前WebSocket连接建立失败,日志停留在“Opening Web Socket...”阶段就不再推进。谷歌搜索未找到同类案例,查看SockJS日志发现connected属性为false,且该功能此前一直正常,无预兆出现此问题。

以下是相关代码及控制台日志信息:

前端JavaScript代码

<script th:inline="javascript">
    /*<![CDATA[*/
    $(document).ready(function(){

        var roomId = [[${room.roomId}]];
        var username = [[${session.loginId}]];
        const date = new Date();
        var time = date.toLocaleTimeString('ko-kr').substring(0, 7);

        console.log(roomId + ", " + username);

        var sockJs = new SockJS("/stomp/chat");
        var stomp = Stomp.over(sockJs);

        axios.get('/chat/user').then(response => {
            this.token = response.headers.token;
            console.log("token : " + this.token);
            console.log(sockJs);
            console.log(stomp);

            stomp.connect({"token" : this.token}, function (){
                console.log("STOMP Connection")

                stomp.subscribe("/sub/chat/room/" + roomId, function (chat) {
                    var content = JSON.parse(chat.body);

                    var writer = content.writer;
                    var message = content.message;
                    var str = '';

                    if(writer === username){
                        str = "<div class='col-6'>";
                        str += "<div class='alert alert-secondary'>";
                        str += "<b>" + time + " " + writer + " : " + message + "</b>";
                        str += "</div></div>";
                    }
                    else{
                        str = "<div class='col-6'>";
                        str += "<div class='alert alert-warning'>";
                        str += "<b>" + time + " " + writer + " : " + message + "</b>";
                        str += "</div></div>";
                    }
                    $("#msgArea").append(str);
                });

                stomp.send('/pub/chat/enter', {}, JSON.stringify({roomId: roomId, writer: username}))
            });

        })

        $("#button-send").on("click", function(e){
            var msg = document.getElementById("msg");

            console.log(username + ":" + msg.value);
            stomp.send('/pub/chat/message', {}, JSON.stringify({roomId: roomId, message: msg.value, writer: username}));
            msg.value = '';
        });

        var input = document.getElementById('msg');

        input.addEventListener("keyup", function (event) {
            if (event.keyCode === 13) {
                document.getElementById("button-send").click();
            }
        });
    });
    /*]]>*/
</script>

后端控制器代码 (StompChatController.java)

package com.capston.chatting.controller.chat;

import com.capston.chatting.dto.ChatMessageDTO;
import com.capston.chatting.entity.ChatRoom;
import com.capston.chatting.entity.Member;
import com.capston.chatting.provider.JwtTokenProvider;
import com.capston.chatting.repository.MemberRepository;
import com.capston.chatting.service.chat.ChatMessageService;
import com.capston.chatting.service.chat.ChatRoomService;
import com.capston.chatting.service.member.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;

import java.time.LocalDateTime;

@Slf4j
@Controller
@RequiredArgsConstructor
public class StompChatController {

    private final SimpMessagingTemplate template;
    private final ChatRoomService chatRoomService;
    private final MemberRepository memberRepository;
    private final ChatMessageService chatMessageService;

    /**
     * 发送消息时调用的控制器
     * @param message
     */
    @MessageMapping(value = "/chat/message")
    public void message(ChatMessageDTO message) {
        Member findMember = memberRepository.findMemberByLoginId(message.getWriter());

        ChatRoom findRoom = chatRoomService.findRoomById(message.getRoomId(), findMember);

        String date = LocalDateTime.now().toString().substring(11, 16);

        chatMessageService.save(findRoom, message.getMessage(), date, findMember.getLoginId());

        log.info("{} : 消息已输入. message = {}, writer = {}", message.getRoomId(), message.getMessage(), message.getWriter());
        template.convertAndSend("/sub/chat/room/" + message.getRoomId(), message);
    }
}

WebSocket配置代码 (StompWebSocketConfig.java)

package com.capston.chatting.config;

import com.capston.chatting.interceptor.StompHandlerInterceptor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Slf4j
@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class StompWebSocketConfig implements WebSocketMessageBrokerConfigurer {

    private final StompHandlerInterceptor stompHandlerInterceptor;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp/chat")
                .setAllowedOrigins("http://localhost:8080")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/sub");
        registry.setApplicationDestinationPrefixes("/pub");
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(stompHandlerInterceptor);
    }
}

控制台日志截图

控制台日志截图


内容的提问来源于stack exchange,提问作者pollpoll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:27:21