Websockets 连接在 Pivotal Cloud 上失败,但在本地主机上有效
Websockets connection fails on Pivotal Cloud but works on localhost
我有一个名为 cde-service 的基于 Java Spring 启动的 Web 服务和一个名为 abc-app 的基于 Angular 5 的前端。
abc-app 使用 websocket 连接将日志记录数据发送到 cde-service,后者又对客户端日志数据进行处理。
我已经在本地主机上测试了应用程序,它们按预期工作。
但是,当我将 cde-service 部署到 Pivotal Cloud Foundry 时,websocket 连接失败并显示 403 Forbidden。我已完成更改以允许 CORS。
任何关于为什么会发生这种情况的指示都会很有帮助。
cde 服务:
// Snippet from the Websocket Configuration.
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocketConnection").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
// Snippet from the Controller.
@MessageMapping("/logs")
public void handleLogs(LogModel logModel) {
logService.logHandler(logModel);
}
abc-应用程序:
var sock = new SockJS("http://host_name/websocketConnection");
var stomp = Stomp.over(sock);
stomp.connect('guest', 'guest', function(frame) {
console.log('---- Established Connection ----');
});
stomp.send("/app/logs", {},
JSON.stringify({
'logData': 'Some Data'
}));
However when I deploy cde-service onto Pivotal Cloud Foundry, the websocket connection fails with 403 Forbidden. I have done the changes to allow CORS.
Cloud Foundry 不会添加任何关于在您的应用程序中使用 WebSockets 的规定。标准浏览器客户端应该可以正常工作。在这种情况下,您的客户端应用程序正在尝试连接到您的服务器应用程序,而您的服务器应用程序正在返回 403。您可以找出原因的唯一方法是调试您的服务器应用程序并查看为什么它说 WebSocket 连接被禁止。
平台不会生成 403。
对我来说,CORS 是最有可能的罪魁祸首,但这里没有足够的信息让我做出决定,也可能是其他原因。调高应用程序中的日志级别,看看发生了什么。另外,尝试在本地进行测试,但使用多个域,这样您实际上就必须处理 CORS。
这里唯一需要注意的是,某些 Cloud Foundry 安装要求您的 WebSocket 连接通过不同的端口。这不是 Cloud Foundry 的限制,而是平台运营商使用的负载均衡器的限制。在某些情况下,例如在 AWS 上 运行 时,负载均衡器(ELB,cough)不支持在同一端口上传输 HTTP、HTTPS 和 WebSockets 流量。要解决此负载均衡器限制,运营商将为每个协议提供单独的端口,即 HTTP -> 80、HTTPS 443、WSS 4443。请咨询您的平台运营商以了解您的环境是如何部署的。
我有一个名为 cde-service 的基于 Java Spring 启动的 Web 服务和一个名为 abc-app 的基于 Angular 5 的前端。
abc-app 使用 websocket 连接将日志记录数据发送到 cde-service,后者又对客户端日志数据进行处理。
我已经在本地主机上测试了应用程序,它们按预期工作。
但是,当我将 cde-service 部署到 Pivotal Cloud Foundry 时,websocket 连接失败并显示 403 Forbidden。我已完成更改以允许 CORS。
任何关于为什么会发生这种情况的指示都会很有帮助。
cde 服务:
// Snippet from the Websocket Configuration.
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocketConnection").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
// Snippet from the Controller.
@MessageMapping("/logs")
public void handleLogs(LogModel logModel) {
logService.logHandler(logModel);
}
abc-应用程序:
var sock = new SockJS("http://host_name/websocketConnection");
var stomp = Stomp.over(sock);
stomp.connect('guest', 'guest', function(frame) {
console.log('---- Established Connection ----');
});
stomp.send("/app/logs", {},
JSON.stringify({
'logData': 'Some Data'
}));
However when I deploy cde-service onto Pivotal Cloud Foundry, the websocket connection fails with 403 Forbidden. I have done the changes to allow CORS.
Cloud Foundry 不会添加任何关于在您的应用程序中使用 WebSockets 的规定。标准浏览器客户端应该可以正常工作。在这种情况下,您的客户端应用程序正在尝试连接到您的服务器应用程序,而您的服务器应用程序正在返回 403。您可以找出原因的唯一方法是调试您的服务器应用程序并查看为什么它说 WebSocket 连接被禁止。
平台不会生成 403。
对我来说,CORS 是最有可能的罪魁祸首,但这里没有足够的信息让我做出决定,也可能是其他原因。调高应用程序中的日志级别,看看发生了什么。另外,尝试在本地进行测试,但使用多个域,这样您实际上就必须处理 CORS。
这里唯一需要注意的是,某些 Cloud Foundry 安装要求您的 WebSocket 连接通过不同的端口。这不是 Cloud Foundry 的限制,而是平台运营商使用的负载均衡器的限制。在某些情况下,例如在 AWS 上 运行 时,负载均衡器(ELB,cough)不支持在同一端口上传输 HTTP、HTTPS 和 WebSockets 流量。要解决此负载均衡器限制,运营商将为每个协议提供单独的端口,即 HTTP -> 80、HTTPS 443、WSS 4443。请咨询您的平台运营商以了解您的环境是如何部署的。