Witam,
mam problem z działaniem zestawu Spring WebSocket jako serwer + Spring WebSocket SockJS JAVA jako klient.
Problem polega na tym, że nie działa downgrade protokołu w sytuacji kiedy pomiedzy klientem a serwerem stoi proxy/apache które nie obsługuje WS.
Po stronie klienta w logach mam
The HTTP response from the server [400] did not permit the HTTP upgrade to WebSocket
Starting XHR Streamingsession url=http://localhost/rock/hello/227/f5a0936bdb554c2dbfdc06d10533aa0d/xhr_streaming
Co jest oki bo SockJS próbuje alternatyw ale one też się nie udają bo lecą błedy na serwerze
WebSocketSession not yet initialized
at org.springframework.util.Assert.state(Assert.java:70) ~[spring-core-4.3.17.RELEASE.jar:4.3.17.RELEASE]
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.checkDelegateSessionInitialized(WebSocketServerSockJsSession.java:137) ~[spring-websocket-4.3.17.RELEASE.jar:4.3.17.RELEASE]
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.getPrincipal(WebSocketServerSockJsSession.java:84) ~[spring-websocket-4.3.17.RELEASE.jar:4.3.17.RELEASE]
at org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService.handleTransportRequest(TransportHandlingSockJsService.java:289) ~[spring-websocket-4.3.17.RELEASE.jar:4.3.17.RELEASE]
Niestety na necie nie ma wiele wpisów z tym problemem. TO jest prosta aplikacja helloworld żadnego security i innych libów....
Kod serwera
@Configuration
@EnableWebSocket
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
ApplicationContext context;
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint("/hello");
registry.addEndpoint("/hello").withSockJS();
}
@Scheduled(fixedDelay = 2000)
public void sender() {
Map<String, Object> data = new HashMap<>();
data.put("content", "Hey " + new Date());
context.getBean(SimpMessagingTemplate.class).convertAndSend("/topic/greetings", data);
}
}
Kod klienta
StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
List<Transport> transports = new ArrayList();
transports.add(new WebSocketTransport(webSocketClient));
transports.add(new RestTemplateXhrTransport());
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
String url = "http://localhost/rock/hello";
StompSessionHandler sessionHandler = new MySessionHandler();
ListenableFuture<StompSession> connect = stompClient.connect(url, sessionHandler);