2016-07-14 9 views
10

Co chcę mieć:Uchwyt ten sam adres URL z wiosny MVC RequestMappingHandlerMapping i wiosna websocket za ServletWebSocketHandlerRegistry

  • klient wysyła GET/HTTP/1.1 (bez Connection: upgrade) - wniosek ten powinien być traktowany przez RequestMappingHandlerMapping
  • klient wysyła Connection: upgrade wzdłuż z żądaniem GET - to żądanie powinno być obsługiwane przez: ServletWebSocketHandlerRegistry

Moja konfiguracja Java:

@Configuration 
@EnableWebSocket 
public class WebsocketConfiguration extends WebMvcConfigurationSupport 
            implements WebSocketConfigurer { 
    @Bean 
    WebsocketComponent wsHandler() { 
     return new WebsocketComponent(); 
    } 

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

Mój kontroler webmvc:

@Controller 
public class Status { 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String status() { 
     return "OK"; 
    } 
} 

Problem polega na tym - kiedy kontroler MVC biorąc pierwszeństwo, zawsze odpowie HTTP 200, websocket obsługi nigdy nie osiągnął. Kiedy program obsługi WebSocket ma pierwszeństwo - działa z klientem WebSocket, ale kiedy próbuję klienta HTTP (przeglądarka), odpowiada: Can "Upgrade" only to "WebSocket". Czy jest możliwe zastąpienie w jakiś sposób tej strony błędu z powrotem do mojego mapowania MVC? Jakieś inne konfiguracje, aby najpierw to, co napisałem?

+0

Czy jesteś pewien, że mapowania żądań Spring MVC mają mniejszy priorytet niż mapowania WebSocket? Na przykład, czy możesz otworzyć połączenie z gniazdem sieciowym na serwerze ws: // localhost: 8080/status'? –

+0

@AliDehghani pewnie, połączenie z siecią działa, zwykłe połączenie http nie działa z: 00:30:20 BŁĄD Uścisk dłoni nie powiódł się z powodu nieprawidłowego nagłówka aktualizacji: null – vitalyster

+0

Wygląda na to, że twój "WebSocketHandlerMapping' ma wyższy priorytet niż twój" RequestMappingHandlerMapping ". Zwykle jest na odwrót. Opublikuj więcej informacji na temat swoich konfiguracji –

Odpowiedz

7

Problem polega na tym - kiedy kontroler MVC biorąc pierwszeństwo, to zawsze odpowiedzieć HTTP 200, nigdy websocket obsługi osiągnęła

Kiedy RequestMappingHandlerMapping ma pierwszeństwo przed WebSocketHandlerMapping, na życzenie do punktu końcowego, że oba mogą obsłużyć (jeśli tylko przyjmiesz adres URL), DispatcherServlet wyśle ​​żądanie do metod @RequestMapping, a nie do programu obsługi WebSocket. W celu rozwiązania tego problemu, nie ograniczają @RequestMapping metodę tylko służyć wniosek bez Connection:Upgrade nagłówka:

@Controller 
public class Status { 
    @RequestMapping(value = "/", method = GET, headers = "Connection!=Upgrade") 
    public String status() { 
     return "OK"; 
    } 
} 

ten sposób, gdy DispatcherServlet wyszukuje obsługi dla tego wspólnego punktu końcowego, byłoby rozważyć obecność lub nieobecność Connection:Upgrade nagłówek, aby określić prawą obsługę do spełnienia żądania.

+1

Świetnie, działa! – vitalyster

Powiązane problemy