【问题标题】:The HTTP response from the server [200] did not permit the HTTP upgrade to WebSocket来自服务器 [200] 的 HTTP 响应不允许 HTTP 升级到 WebSocket
【发布时间】:2019-04-05 22:31:23
【问题描述】:

我的 websocket 客户端是在 STOMP Java 客户端(Spring 项目)中开发的,服务器是在 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 - 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

我没有找到任何有关如何解决此问题及其原因的信息。

请帮我解决这个问题。

【问题讨论】:

  • 发生了什么很明显。您发送的每个 HTTP 请求都被重定向到 login.jsp 页面。 200 来自请求该登录页面的时间。很明显,您没有正确的凭据来访问 WebSocket 资源,或者您没有正确发送它们。
  • 您好,感谢您的回复。我是 websockets 的新手。我们如何向 websocket 客户端请求添加凭据。

标签: java spring websocket stomp sockjs


【解决方案1】:

为您的问题提供有用的解决方案为时已晚。今天我面临着你已经经历过的同样的问题。不幸的是,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了解协议之间的切换。

我希望它对正在寻找摆脱错误的方法的人有所帮助。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多