Récemment, lors de l'apprentissage de Spring WebSocket, j'ai écrit le code selon les exemples de Spring in Action, et le navigateur a signalé une erreur 404 lors de l'exécution.
Connexion WebSocket à «ws: // localhost / WebSocket / Marco» Échec: Erreur pendant la poignée de main WebSocket: Code de réponse inattendu: 404
Suivez les étapes du printemps en action:
Tout d'abord, héritez de l'AbstractWebsockethandler et surchargez les 3 méthodes suivantes:
- HandleTExtMessage Gands Messages de type de texte
- Afterconnection a été appelé après une nouvelle connexion établie
- Appel claqué après la connexion après la fermeture de la connexion
import org.springframework.web.socket.closestatus; import org.springframework.web.socket.textmesage; import org.springframework.web.socket.websocketSession void HandleTExtMessage (Session WebSocketSession, Message TextMessage) lève une exception {System.out.println ("Message reçu:" + message.getPayload ()); Thread.Sleep (2000); session.sendMessage (new TextMessage ("Polo!")); } @Override public void AfterConnectionEstAlled (Websocketession session) {System.out.println ("Connexion établie!"); } @Override public void AfterConnectionClosed (Session WebSocketSession, statut de CloseStatus) {System.out.println ("Connexion Fermed. Status:" + Status); }}Deuxièmement, activez les processeurs de messages WebSocket et Map à l'aide de Javaconfig
import org.springframework.context.annotation.bean; import org.springframework.web.socket.config.annotation.enablewebsocket; import org.springframework.web.socket.config.annotation.websocketconfigurer; import; org.springframework.web.socket.config.annotation.websockethandlerRegistry; @enablewebsocketpublic class WebsocketConfigurer implémente WebSocketConfigurer {@Override Public Void RegisterwebsockethandLers (WebSocketHetHandlerGistry Registry) {registre.addhandler (marcohandler (), "/ marco); } @Bean public marcohandler marcohandler () {return new marcohandler (); }}Enfin, écrivez le code JS frontal pour initier les demandes de connexion et les interactions de messages ultérieures
var url = 'ws: //' + window.location.host + '/ Websocket / marco'; var sock = new WebSocket (url); sock.onopen = function () {console.log ('ouverture'); sock.send ('marco!');}; sock.onMessage = function (e) {console.log ('Message reçu:', e.data); setTimeout (function () {sayMarco ()}, 2000);}; sock.OnClose = function () {console.log ('clôture');}; fonction SayMarco () {console.log ('Envoi de Marco!'); sock.send ('marco!');}Après le déploiement, ouvrez le navigateur et exécutez-le, et signalez directement une erreur 404
La recherche sur Internet d'une solution de nuit, y compris l'expérience sur stackoverflow.com, n'a pas résolu le problème avant d'avoir visionné l'article suivant:
Solution à Spring Integrated Page Web Access 404 Problème
Faisons un disque ici pour éviter d'oublier plus tard.
WebSocket emprunte essentiellement les demandes HTTP pour la poignée de main. Pour activer Spring WebSocket, vous devez configurer l'interception de cette demande dans org.springframework.web.servlet.dispatcherservlet.
Voici les solutions:
Tout d'abord, modifiez la définition de la classe WebSocketConfig et ajoutez l'annotation @configuration à la classe, indiquant que la classe est utilisée comme source de définition de bean sous la forme de Javaconfig (équivalent à l'élément <bans> dans la configuration XML).
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.web.socket.config.annotation.enablewobote; org.springframework.web.socket.config.annotation.websockethandlerRegistry; @ configuration @ activerwebsocketpublic WebsocketConfig implémente WebSocketConfigurer {@Override VOID Registerwebsockethandlers (WebsockethandlerGistry Registry) {registre.adddler (marcohandler (), "/ marco"); } @Bean public marcohandler marcohandler () {return new marcohandler (); }} Deuxièmement, utilisez JavaconFig pour configurer le DispatcherServlet, Hériter Org.SpringFramework.Web.servlet.Support.AbstractannotationConfigDispatcherservletInitializer, et surcharger les 3 méthodes suivantes:
- GetrootConfigClasses renvoie la classe avec @configuration annotation pour configurer les beans dans le contexte de l'application créé par contextOtLoderListener
- getServletConfigClasses renvoie la classe avec @configuration annotation pour définir le bean dans le contexte de l'application DispatcherServlet
- GetservletMappings mappe un ou plusieurs chemins de Dispatcherservlet
En fait, si vous n'avez besoin que de Spring WebSocket pour prendre effet, il vous suffit de retourner le bean dans la méthode getServletConfigClasses qui définit le contexte de l'application DispatcherServlet.
import org.springframework.web.servlet.support.abstractannotationConfigDispatcherservletInitializer; la classe publique WebSocketInitializer étend AbstractannotationConfigDispatterServitializer {@Override Protected Class <?> [] GetrootConFigClasses () {return null; } @Override Protected class <?> [] GetServletConfigClasses () {return new class <?> [] {WebsocketConfig.class}; } @Override Protected String [] getServletMappings () {return new String [] {"/"}; }}Redéployer le descendant et ouvrir le navigateur avec succès
Message client
Message de serveur
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.