Описание проблемы
Я настроил соединение WebSocket из своего приложения React. к бэкэнду Spring Boot с использованием STOMP через WebSocket. Вот основные сведения о моей настройке:
Бэкэнд: приложение Spring Boot, настроенное с помощью @EnableWebSocketMessageBroker и использующее WebSocketMessageBrokerConfigurer для настройки конечных точек и брокеров сообщений.
Внешний интерфейс: приложение React использует @stomp/stompjs для установки соединения WebSocket с ws://localhost:9090/ws.
Ошибка: соединение WebSocket завершается с ошибкой:
Ошибка: соединение WebSocket завершается с ошибкой:
Код: Выделить всё
WebSocket connection to 'ws://localhost:9090/ws' failed: Connection closed
STOMP: scheduling reconnection in 5000ms
Конфигурация серверной части: я настроил конечные точки WebSocket и брокеры сообщений в своем приложении Spring Boot с помощью WebSocketMessageBrokerConfigurer
Код: Выделить всё
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
Код: Выделить всё
import React, { useEffect, useState } from "react";
import { Client } from "@stomp/stompjs";
const ChatWindow = ({ user }) => {
const [client, setClient] = useState(null);
useEffect(() => {
const newClient = new Client({
brokerURL: "ws://localhost:9090/ws",
connectHeaders: {
login: "guest",
passcode: "guest",
},
debug: (str) => {
console.log(str);
},
});
newClient.onConnect = () => {
console.log("Connected to WebSocket");
};
newClient.activate();
setClient(newClient);
return () => {
newClient.deactivate();
};
}, []);
// Other methods and state management for sending/receiving messages
return (
// JSX for rendering chat window
);
};
export default ChatWindow;
2024-06-23T11:05:14.961+05:30 INFO 2456 --- [чат] [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats : WebSocketSession[0 текущий WS(0)-HttpStream(0)-HttpPoll(0), всего 0, 0 аварийно закрыто (0 сбой подключения, 0 ограничение отправки, 0 ошибка транспорта)] , stompSubProtocol[обработано CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[размер пула = 0, активные потоки = 0, задачи в очереди = 0, завершенные задачи = 0], outboundChannel[ размер пула = 0, активные потоки = 0, задачи в очереди = 0, завершенные задачи = 0], sockJsScheduler[размер пула = 1, активные потоки = 1, задачи в очереди = 0, завершенные задачи = 0]
в контексте с путем [] выдало исключение [Ошибка обработки запроса: java.lang.IllegalArgumentException: если параметрallowCredentials имеет значение true, то AllowCredentials не может содержать специальное значение "*", поскольку оно не может быть установлено в "Access-Control-Allow" -Origin» заголовок ответа. Чтобы разрешить учетные данные для набора источников, перечислите их явно или рассмотрите возможность использования вместо этого «allowedOriginPatterns».] с основной причиной
java.lang.IllegalArgumentException: если значение параметраallowCredentials равно true, разрешенныеOrigins не могут содержать специальное значение «*», поскольку его нельзя установить в заголовке ответа «Access-Control-Allow-Origin». Чтобы разрешить учетные данные для набора источников, перечислите их явно или рассмотрите возможность использования вместо этого «allowedOriginPatterns».
Моя настройка cors ==>
Код: Выделить всё
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("http://localhost:5173")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true) // allow credentials
.allowedHeaders("*");
}
}
Я ожидаю, что соединение WebSocket будет успешно установлено между моим интерфейсом React и сервером Spring Boot, настроенным с помощью STOMP. Однако я сталкиваюсь с постоянными сбоями подключения с автоматическими попытками повторного подключения каждые 5000 мс.
Дополнительная информация
Настройка сети: я убедился, что и интерфейсная, и серверная части работают на тот же компьютер, и я проверил наличие проблем с сетью или ограничений брандмауэра.
Журналы: внутренние журналы указывают на успешный запуск сервера WebSocket на порту 9090.
Анализ ошибок: сообщение об ошибке не содержит подробной информации о основная причина закрытия соединения.
Вопрос
Что может быть причиной неоднократного сбоя соединения WebSocket и как я могу устранить или решить эту проблему? Существуют ли дополнительные настройки или проверки, которые мне следует выполнить, чтобы обеспечить стабильное соединение WebSocket между моим интерфейсом React и сервером Spring Boot?
И я использую два порта для загрузки sprinb на 9090 и сокет. ио 8080
Подробнее здесь: https://stackoverflow.com/questions/786 ... ion-closed