Java 服务器[200]的HTTP响应不允许HTTP升级到WebSocket
我的websocket客户端是在StompJava客户端(Spring项目)中开发的,服务器是在SpringBoot中实现的 当客户端/服务器握手发生时,我遇到了连接升级问题 Java客户端代码Java 服务器[200]的HTTP响应不允许HTTP升级到WebSocket,java,spring,websocket,stomp,sockjs,Java,Spring,Websocket,Stomp,Sockjs,我的websocket客户端是在StompJava客户端(Spring项目)中开发的,服务器是在SpringBoot中实现的 当客户端/服务器握手发生时,我遇到了连接升级问题 Java客户端代码 List<Transport> transports = new ArrayList<>(1); transports.add(new WebSocketTransport(new StandardWebSocketClient())); SockJsClient
List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
SockJsClient sockjsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockjsClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
stompClient.setTaskScheduler(new ConcurrentTaskScheduler());
StompSessionHandler sessionHandler = new SessionHandler();
stompClient.connect("ws://localhost:9090/health", sessionHandler);
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/health")
.setAllowedOrigins("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
连接到服务器时在客户端生成异常
16:18:50.955/3771 [SimpleAsyncTaskExecutor-1] ERROR o.s.w.s.s.c.DefaultTransportRequest - No more fallback transports after TransportRequest[url=ws://localhost:9090/health/29/344d627baac949f5bab5506f05f1a7eb/websocket]
javax.websocket.DeploymentException: The HTTP response from the server [200] did not permit the HTTP upgrade to WebSocket
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:434)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:392)
at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:194)
at org.springframework.web.socket.client.standard.StandardWebSocketClient.lambda$doHandshakeInternal$0(StandardWebSocketClient.java:150)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
16:18:50.955/3771[SimpleAsynctaskeExecutor-1]错误o.s.w.s.s.c.DefaultTransportRequest-TransportRequest之后不再有回退传输[url=ws://localhost:9090/health/29/344d627baac949f5bab5506f05f1a7eb/websocket]
javax.websocket.DeploymentException:服务器[200]的HTTP响应不允许HTTP升级到websocket
位于org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:434)
位于org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:392)
位于org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:194)
位于org.springframework.web.socket.client.standard.StandardWebSocketClient.lambda$doHandshakeInternal$0(StandardWebSocketClient.java:150)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
运行(Thread.java:745)
在tomcat localhost\u access\u日志中,我看到以下请求信息
127.0.0.1 - - [01/Nov/2018:22:09:41 +0530] "GET /health/info HTTP/1.1" 302 - 0
127.0.0.1 - - [01/Nov/2018:22:09:41 +0530] "GET /login.jsp HTTP/1.1" 200 7649 16
127.0.0.1 - - [01/Nov/2018:22:09:41 +0530] "GET /health/191/6828a1fdefee40cf8dc74e825d8d2b0c/websocket HTTP/1.1" 302 - 0
127.0.0.1 - - [01/Nov/2018:22:09:41 +0530] "GET /login.jsp HTTP/1.1" 200 7649 0
127.0.0.1--[01/Nov/2018:22:09:41+0530]“GET/health/info HTTP/1.1”302-0
127.0.0.1---[01/Nov/2018:22:09:41+0530]“GET/login.jsp HTTP/1.1”200 7649 16
127.0.0.1---[01/Nov/2018:22:09:41+0530]“GET/health/191/6828a1fdefee40cf8dc74e825d8d2b0c/websocket HTTP/1.1”302-0
127.0.0.1---[01/Nov/2018:22:09:41+0530]“GET/login.jsp HTTP/1.1”200 7649 0
我没有找到有关如何解决此问题以及导致此问题的原因的任何信息
请帮助我解决此问题。太晚了,无法为您的问题提供有用的解决方案。今天,我面临的问题和你们已经经历过的一样。不幸的是,Spring框架示例和官方资源并没有完全引用。因此,我想写下我是如何制作和运行的。首先,原来的答案不属于我。我在家里找到的 据我所知,为了能够从HTTP升级WebSocket协议,我们应该使用所需的功能稍微扩展“WebSocket配置”部分
RequestUpgradeStrategy-upgradeStrategy=new-TomcatRequestUpgradeStrategy();
registry.addEndpoint(“/hello”)
.withSockJS();
registry.addEndpoint(“/hello”)
.setHandshakeHandler(新的DefaultHandshakeHandler(升级策略))
.setAllowedOrigins(“*”);
在进行了上述调整之后,您可以通过嗅探WireShark了解协议之间的切换
我希望这对那些正在寻找摆脱错误的方法的人会有所帮助。发生的事情是显而易见的。您发送的每个HTTP请求都被重定向到
login.jsp
页面。当请求登录页面时,200来自。很明显,您没有访问WebSocket资源的正确凭据,或者发送的凭据不正确。您好,谢谢您的回复。我不熟悉WebSocket。如何向websocket客户端请求添加凭据。