Недавно, когда я изучал Spring Websocket, я написал код в соответствии с примерами весны в действии, и браузер сообщил о ошибке 404 во время выполнения.
Подключение к WebSocket с 'ws: // localhost/websocket/marco.
Следуйте шагам весны в действии:
Во -первых, унаследовать AbstractWebsockethandler и перегружать следующие 3 метода:
- handletextmessage обрабатывает сообщения текста типа
- После установки после создания после установки нового соединения
- После закрытия соединения после закрытия соединения соединение
Импорт org.springframework.web.socket.closestatus; import org.springframework.web.socket.textmessage; import org.springframework.web.socket.websocketsession; импорт org.springframe.web.sockethesters abletsledends. void handletextmessage (сеанс WebSocketSession, сообщение TextMessage) Throws Exception {System.out.println ("Полученное сообщение:" + message.getPayload ()); Thread.sleep (2000); session.sendmessage (new Textmessage ("polo!")); } @Override public void efferconceSectionabledicated (WebSocketSession Session) {System.out.println ("Соединение установлено!"); } @Override public void efferconnectionClosed (WebSocketSession Session, CloseStatus) {System.out.println ("Connection Closed. Status:" + Status); }}Во -вторых, включить процессоры сообщений WebSocket и MAP с помощью javaconfig
Импорт org.springframework.context.annotation.bean; import org.springframework.web.socket.config.annotation.enablewebsocket; import org.springframework.web.socket.config.annotation.websocketConfure; importwork.web.socket.config.annotation.websocketConfirurer; importwork.web.socket.config.annotation.websocketConfure; org.springframework.web.socket.config.annotation.websockethandlerregistry; @enablewebocketpoctpublic класса WebSoteCocketConfigurer реализует webSocketConfigurer {@Override public void Registerswebockethandlers (webockethandlerregistry) {regristry.addhandler (marcohandler () "/marco"); } @Bean public marcohandler marcohandler () {return new marcohandler (); }}Наконец, напишите код JS Front-END, чтобы инициировать запросы на соединение и последующие взаимодействия сообщений
var url = 'ws: //' + window.location.host + '/websocket/marco'; var sock = new websocket (url); sock.onopen = function () {console.log ('Открытие'); sock.send ('marco!');}; sock.onmessage = function (e) {console.log ('полученное сообщение:', e.data); setTimeout (function () {saymarco ()}, 2000);}; sock.onclose = function () {console.log ('Закрытие');}; function saymarco () {console.log ('отправка Marco!'); sock.send ('marco!');}После развертывания откройте браузер и запустите его, и напрямую сообщите об ошибке 404
Поиск в Интернете для ночного решения, включая опыт на Stackoverflow.com, не решил проблему, пока я не просмотрел следующую статью:
Решение Spring Integrated WebSocket Page Access 404 Проблема
Давайте сделаем запись здесь, чтобы не забыть позже.
WebSocket по существу заимствует HTTP -запросы на рукопожатие. Чтобы включить Spring Websocket, вам необходимо настроить перехват этого запроса в org.springframework.web.servlet.dispatcherservlet.
Вот решения:
Во -первых, изменить определение класса WebSocketCocketConfig и добавить аннотацию @Configuration в класс, указывая на то, что класс используется в качестве источника определения бобов в форме javaConfig (эквивалентно элементу <Abeans> в конфигурации XML).
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(marcoHandler(), "/marco"); } @Bean public marcohandler marcohandler () {return new marcohandler (); }} Во -вторых, используйте javaconfig для настройки DispatcherServlet, наследника org.springframework.web.servlet.support.abstractannotationConfigDispatcherServletinitializer и перегружать следующие 3 метода:
- getRootConfigClasses Возвращает класс с аннотацией @Configuration для настройки бобов в контексте приложения, созданном ContectflegloaderListener
- GetservletConfigClasses Возвращает класс с аннотацией @Configuration, чтобы определить боб в контексте приложения DispatcherServlet
- GeterVletMappings Map один или несколько путей к DispatcherServlet
На самом деле, если вам нужно только Spring Websocket, вам нужно только вернуть бобы в методе GetServletConfigClasses, который определяет контекст приложения DispatcherServlet.
Импорт org.springframework.web.servlet.support.abstractannotationConfigDispatcherServletinitialize; public class webSocketinitializer расширяет AbstractAnnotationConfigDipatcherServletinitializer { @@Override Protected Class <?> [] GetRootConfigClasses () {return null; } @Override Protected Class <?> [] GetServletConfigClasses () {return New Class <?> [] {WebsocketCoctConfig.class}; } @Override защищенная string [] getServletMappings () {return new String [] {"/"}; }}Переведите потомка и успешно открыть браузер
Клиентское сообщение
Серверное сообщение
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.