Recentemente, ao aprender o Spring WebSocket, escrevi o código de acordo com os exemplos na primavera em ação, e o navegador relatou um erro 404 no tempo de execução.
WebSocket Connection com 'ws: // localhost/websocket/marco' falhou: erro durante o websocket handshake: código de resposta inesperado: 404
Siga as etapas na primavera em ação:
Primeiro, herde o AbstractWebSocketHandler e sobrecarregue os três métodos a seguir:
- HandleTextMessage lida com mensagens do tipo de texto
- AfterConnectionEstabled chamado depois que uma nova conexão for estabelecida
- Afterconection reclamou a chamada depois que a conexão estiver fechada
importar org.springframework.web.socket.cloSestatus; importar org.springframework.web.socket.textMessage; importar org.springframework.web.hakler.Handler.WebsocketSession; importação org.springframework.web.hatock.handler.websessession; importbrock; AbstractWebsocketHandler {Protected void handleTextMessage (sessão WebSocketSession, mensagem textMessage) lança Exceção {System.out.println ("Mensagem recebeu:" + message.getPayload ()); Thread.sleep (2000); session.sendMessage (novo textMessage ("polo!")); } @Override public void AfterConnectionEstabled (WebSocketSession Session) {System.out.println ("Conexão estabelecida!"); } @Override public void AfterConnectionClosed (Sessão WebSocketSession, status próximo) {System.out.println ("Conexão fechada. Status:" + status); }}Segundo, ative os processadores de mensagens WebSocket e mapear usando Javaconfig
importar org.springframework.context.annotation.bean; importar org.springframework.web.socket.config.annotation.enablewebsocket; importar org.springframework.web.socket.config.annotation.websocketconfigurer; org.springframework.web.socket.config.annotation.websockethandlerGistry; @enablewebsocketpublic classe websocketconfigurer implementa WebSocketConfigurer {@Override Registerwebsockethandlers (WebSockethandlerRegistry) (Registryndride). } @Bean public marcohandler marcohandler () {return new marcohandler (); }}Por fim, escreva o código JS front-end para iniciar solicitações de conexão e interações subsequentes de mensagens
var url = 'ws: //' + window.location.host + '/websocket/marco'; var sock = new websocket (url); sock.onopen = function () {console.log ('abertura'); sock.send ('marco!');}; sock.onmessage = function (e) {console.log ('mensagem recebida:', e.data); setTimeout (function () {saymarco ()}, 2000);}; sock.onclose = function () {console.log ('fechamento');}; function saymarco () {console.log ('envia marco!'); Sock.send ('Marco!');}Após a implantação, abra o navegador e execute -o e relate diretamente um erro 404
Pesquisando na Internet por uma solução noturna, incluindo a experiência no Stackoverflow.com, não resolveu o problema até que eu visitei o seguinte artigo:
Solução para o Spring Integrated WebSocket Page Access 404 Problema
Vamos fazer um disco aqui para evitar esquecer mais tarde.
O WebSocket empréstimos essencialmente solicitações http de handshake. Para ativar a Spring WebSocket, você precisa configurar a interceptação dessa solicitação no org.springframework.web.servlet.dispatcherServlet.
Aqui estão as soluções:
Primeiro, modifique a definição da classe WebSocketConfig e adicione a anotação @Configuration à classe, indicando que a classe é usada como fonte de definição de feijão na forma de javaconfig (equivalente ao elemento <eapes> na configuração 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.websockethandlerRegustry;@Configuration@EnableWebSocketPublic classe websocketconfig implementa WebSocketConfigurer {@Override Void RegisterwebsockThlers (WebSocketHandlergistry, Registry. } @Bean public marcohandler marcohandler () {return new marcohandler (); }} Em segundo lugar, use o Javaconfig para configurar o DispatcheserServlet, herde o org.springframework.web.servlet.support.abstractAnnotationConfigDispatcheserVletLitializer e sobrecarregar os 3 métodos:
- GetRootConfigClasses retorna a classe com anotação @Configuration para configurar feijões no contexto do aplicativo criado pelo contextLoaderListener
- GetServletConfigClasses retorna a classe com anotação @Configuration para definir o feijão no contexto do aplicativo DispatcheServlet
- GetServletMappings Mapear um ou mais caminhos para despachar o serviço
De fato, se você precisar apenas de spring websocket para entrar em vigor, só precisará devolver o feijão no método GetServletConfigClasses que define o contexto do aplicativo DispatcheserServlet.
importar org.springframework.web.servlet.support.abstractAnnotationConfigDispatcherStletLitializer; classe pública WebSocketInitializer estende abstratoNotationConfigDispatherServLesSesses (@Override Protect <?> [] getRootConfigClASSES () {@Override Class <?> [] getRootConfigClASSEs (@Override Protect <?> [] } @Override Classe protegida <?> [] GetServletConfigClasses () {return } @Override Protected String [] getServletMappings () {return new String [] {"/"}; }}Reimplava o descendente e abra o navegador com sucesso
Mensagem do cliente
Mensagem do servidor
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.