Cosa voglio avere:Maneggiare lo stesso URL con Spring MVC RequestMappingHandlerMapping e ServletWebSocketHandlerRegistry Primavera websocket
- client invia
GET/HTTP/1.1
(senzaConnection: upgrade
) - tale richiesta dovrebbe essere gestita daRequestMappingHandlerMapping
- client invia
Connection: upgrade
lungo con richiesta GET - tale richiesta dovrebbe essere gestita daServletWebSocketHandlerRegistry
la mia configurazione di 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("*");
}
}
mio regolatore webmvc:
@Controller
public class Status {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String status() {
return "OK";
}
}
Il problema è - quando il controller MVC la precedenza, si risponde sempre con HTTP 200, gestore WebSocket non ha mai raggiunto. Quando il gestore WebSocket ha la precedenza, funziona con il client WebSocket, ma quando provo il client http (browser) risponde con Can "Upgrade" only to "WebSocket".
È possibile sostituire in qualche modo questa pagina di errore con fallback alla mia mappatura MVC? Qualche altra configurazione per fare ciò che ho descritto per primo?
Sono sicuro del fatto che i mapping delle richieste di Spring MVC hanno precedenza più bassa rispetto ai mapping WebSocket? Ad esempio, puoi aprire una connessione socket web su 'ws: // localhost: 8080/status'? –
@AliDehghani sicuro, la connessione websocket funziona, la semplice connessione http non ha funzionato con: 00:30:20 ERRORE Handshake non riuscito a causa dell'errore Intestazione aggiornamento: null – vitalyster
Apparentemente, il tuo 'WebSocketHandlerMapping' ha più precedenza sul tuo' RequestMappingHandlerMapping'. Di solito è il contrario, per favore pubblica più informazioni sulle tue configurazioni –