我正在尝试使用新的(从4.2版本开始)Java STOMP客户端支持。我的起点是入门指南(使用WebSocket构建交互式Web应用程序)。
示例中提供了以下端点:
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").withSockJS();
}
我可以成功使用浏览器客户端进行连接。当尝试使用以下Java STOMP客户端连接到此端点时:
WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
stompClient.setMessageConverter(new StringMessageConverter());
String url = "ws://127.0.0.1:8080/hello";
ListenableFuture<StompSession> future = stompClient.connect(url,myHandler);
我遇到了以下异常:
08:56:30.629 [SimpleAsyncTaskExecutor-1] DEBUG o.s.m.simp.stomp.DefaultStompSession - Failed to connect session id=4e6737da-8f68-691d-375f-9e46f48bc149 javax.websocket.DeploymentException:服务器的HTTP响应[HTTP / 1.1 200 OK]不允许将HTTP升级为WebSocket at org.apache.tomcat.websocket.WsWebSocketContainer.parseStatus(WsWebSocketContainer.java:637) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20] at org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:621) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20] at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:309) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20] at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:152) ~[spring-websocket-4.2.0.BUILD-SNAPSHOT.jar:4.2.0.BUILD-SNAPSHOT] at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:149) ~[spring-websocket-4.2.0.BUILD-SNAPSHOT.jar:4.2.0.BUILD-SNAPSHOT] at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0] at java.lang.Thread.run(Unknown Source) [na:1.8.0]
经过进一步调查,我根据StompWebSocketIntegrationTests.java中使用的TomcatWebSocketTestServer.java更改了服务器端点配置如下:
RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
.setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
.setAllowedOrigins("*");
我现在可以连接,但浏览器客户端不能连接。
GET http://localhost:8080/hello/info 404 (Not Found)
如果我将.withSockJs()添加到端点配置中:
RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
.setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
.setAllowedOrigins("*")
.withSockJs();
浏览器客户端可以重新连接,但Java客户端回到原始错误。在这种情况下,我应该能够在两个客户端之间共享相同的终端点吗?还是我需要配置两个单独的终端点?
registry.addEndpoint("/hello").setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy)).setAllowedOriginPatterns("*").withSockJS();
另外,将setAllowedOrigins
更改为setAllowedOriginPatterns
。 - Daniel Gannota