来自服务器[200]的HTTP响应不允许HTTP升级到WebSocket

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自服务器[200]的HTTP响应不允许HTTP升级到WebSocket相关的知识,希望对你有一定的参考价值。

我有在STOMP Java客户端(Spring项目)中开发的Websocket客户端和在Spring Boot中实现的服务器。

当客户端/服务器握手发生时,我遇到连接升级问题。

Java客户端代码

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]错误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)在java.lang.Thread.run(Thread.java:745)

在tomcat localhost_access_log中,我看到以下请求信息

127.0.0.1--[01 / Nov / 2018:22:09:41 +0530]“ GET / health / info HTTP / 1.1” 302-0127.0.0.1--[01 / Nov / 2018:22:09:41 +0530]“ GET /login.jsp HTTP / 1.1” 200 7649 16127.0.0.1--[01 / Nov / 2018:22:09:41 +0530]“ GET / health / 191 / 6828a1fdefee40cf8dc74e825d8d2b0c / websocket HTTP / 1.1” 302-0127.0.0.1--[01 / Nov / 2018:22:09:41 +0530]“ GET /login.jsp HTTP / 1.1” 200 7649 0

我没有找到有关如何解决此问题以及导致此问题的任何信息。

请帮助我解决此问题。

答案

为时已晚,无法为您的问题提供有用的解决方案。今天,我面临着您已经遇到的同一问题。不幸的是,Spring Framework示例和官方资源并未完全引用。因此,我想写一下我的制作和运行方式。首先,原始答案不属于我。我在https://code5.cn/so/java/783097找到了它。

据我所知,为了能够从HTTP升级WebSocket协议,我们应该使用所需的功能对“ WebSocketConfiguration”部分进行一些扩展。

RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
        .withSockJS();

registry.addEndpoint("/hello")
        .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
        .setAllowedOrigins("*");

进行了上述调整之后,您将了解通过嗅探WireShark在协议之间进行切换。

enter image description here

我希望这对寻求摆脱错误的方法的人有所帮助。

以上是关于来自服务器[200]的HTTP响应不允许HTTP升级到WebSocket的主要内容,如果未能解决你的问题,请参考以下文章

OPTIONS "http:192.200.2.2/example.com/api/value" 405(不允许的方法)& prelight 的响应具有无效的 HTTP 状

如何避免来自 HttpURLConnection 的空 HTTP 响应出现 EOFException?

正确的 HTTP 状态码到错误的输入

BizTalk 捕获 Http 响应代码

http响应消息的响应状态码和意义

http响应消息的响应状态码和意义