2016-09-24 3 views
0

Я использовал websocket весной, но клиент JavaScript не может подключиться к веб-узлу.JavaScript-клиент не может подключиться к Spring 4 WebSocket

Вот класс WebSocketConfig:

package com.myapp.spring.security.config; 
import com.myapp.spring.web.controller.MyWebSocketHandler; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
//import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.socket.WebSocketHandler; 
import org.springframework.web.socket.config.annotation.EnableWebSocket; 
import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 
import org.springframework.web.socket.handler.PerConnectionWebSocketHandler; 

@Configuration 
@EnableWebMvc 
@EnableWebSocket 
@ComponentScan(basePackages={"com.myapp.spring.*"}) 
public class WebSocketConfig implements WebSocketConfigurer { 

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     registry 
       .addHandler(myWebSocketHandler(), "/endpoint") 
       .setAllowedOrigins("*"); 
    } 

    @Bean 
    public WebSocketHandler myWebSocketHandler() { 
     return new PerConnectionWebSocketHandler(MyWebSocketHandler.class); 
    } 


} 

Вот test.html страница, которая пытается подключиться к WebSocket:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
     xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> 

     <body> 

     <p>Going to connect to the WebSocket at /endpoint. Check Console</p> 
     <button onclick="ss()">Send</button> 
     </body> 

     <script type="text/javascript"> 
     var webSocket = new WebSocket("wss://"+document.location.hostname+":8443"+"/endpoint"); 
     webSocket.onopen = function(message) { 
       processOpen(message); 
      }; 
      webSocket.onmessage = function(message) { 
       processMessage(message); 
      }; 
      webSocket.onclose = function(message) { 
       processClose(message); 
      }; 
      webSocket.onerror = function(message) { 
       processError(message); 
      }; 


      function processOpen(message) { 
       console.log("JS: Server Connected... "+message); 
      } 
      function processMessage(message) { 
       console.log("Getting a mess: "+message); 
      } 
      function processClose(message) { 
       console.log("JS: Client disconnected... "+message); 
      } 
      function processError(message) { // 
       console.log("Error occured: "+message); 
      } 

      function ss() { 
       webSocket.send("test"); 
      } 
     </script> 

</html> 

Я инициализируется путь WebSocket быть в /endpoint. Об этом свидетельствует мой сервер журналов, которые говорят, что это произошло:

[org.springframework.web.socket.server.support.WebSocketHandlerMapping] (ServerService Thread Pool -- 75) Mapped URL path [/endpoint] onto handler of type [class org.springframework.web.socket.server.support.WebSocketHttpRequestHandler] 

Когда я открываю test.html, соединение открывается и немедленно разрывает соединение. Функция processOpen(message) и processClose(message) немедленно вызывается один за другим. Так что я делаю неправильно, и как я могу это исправить?

ответ

0

Ваш код java-script в файле test.html выглядит отлично. Может возникнуть проблема с конфигурацией сокета Spring Web, которая закрывает соединение. Ниже приведен рабочий код для сетевой розетки с пружинной загрузкой. Пожалуйста, сравните с вашей конфигурацией.

Web сокет зависимость в pom.xml

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-websocket</artifactId> 
</dependency> 

класс WebSocketHandler класс

@Component 
public class EchoHandler extends TextWebSocketHandler { 
@Override 
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { 
    TextMessage echoMessage = new TextMessage("Echo :" + message.getPayload()); 
    System.out.println("Sending "+echoMessage.getPayload()); 
    session.sendMessage(echoMessage); 
    } 
} 

WebSocket Контроллер

@EnableWebSocket 
@Controller 
public class WSController implements WebSocketConfigurer { 
@Autowired 
private EchoHandler echoHandler; 

@Override 
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
    registry.addHandler(echoHandler, "/echo").setAllowedOrigins("*"); 
    } 
} 

Spring Загрузочный класс приложения

@SpringBootApplication 
public class WSApplication { 

public static void main(String[] args) { 
    SpringApplication.run(WSApplication.class, args); 
    } 
} 
+0

Это не сработало. Я получил сообщение об ошибке (что-то, что говорило о том, что требуется bean-компонент) в WebSocketConfig – user5139637

+0

Можете ли вы показать точное сообщение об ошибке и обновленные классы? Код, который я написал, отлично работает для меня. – abaghel

+0

Я определенно могу и хочу. Но после публикации этого вопроса я понял, что мой вопрос о веб-сокетах несколько отличается. Я сделал еще одну запись SO: http://stackoverflow.com/questions/39683062/enable-cors-for-websockets-in-spring. Если бы вы могли помочь в этом, это было бы потрясающе. огромное спасибо – user5139637

Смежные вопросы