【问题标题】:Websockets connection fails on Pivotal Cloud but works on localhostWebsockets 连接在 Pivotal Cloud 上失败,但在 localhost 上有效
【发布时间】:2018-07-20 21:06:14
【问题描述】:

我有一个名为 cde-service 的基于 Java Spring Boot 的 Web 服务和一个名为 abc-app 的基于 Angular 5 的前端。

abc-app 使用 websocket 连接将日志数据发送到 cde-service,然后 cde-service 对客户端日志数据进行处理。

我已经在 localhost 上测试了应用程序,它们按预期工作。

但是,当我将 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'
  }));

【问题讨论】:

  • 您是否尝试从 PCF 中为您的应用提取事件日志?
  • 我认为您应该看看 Pivotal Cloud Foundry 的 loggregator architecture
  • PCF websockets 仅通过 loggergator 框架公开。您必须构建一个名为 nozzle 的应用程序并进行部署。看看我上面贴的社区firehose-to-syslog喷头链接。
  • @K.AJ - 这是不正确的。您正在谈论针对 Loggregator 使用 WebSockets,这当然是您可以做的事情,但这绝不是您可以在 Cloud Foundry 上使用 WebSockets 做的唯一事情。 任何在 CF 上运行的应用程序都可以使用 WebSockets,并且应用程序可以将它用于应用程序认为合适的任何目的。该应用程序确实不需要需要创建喷嘴或其他任何东西。任何标准的 WebSocket 客户端,比如浏览器中的客户端,都应该可以正常工作。

标签: stomp spring-websocket cloud-foundry sockjs


【解决方案1】:

但是,当我将 cde-service 部署到 Pivotal Cloud Foundry 时,websocket 连接失败并显示 403 Forbidden。我已完成更改以允许 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。请咨询您的平台运营商,了解您的环境是如何部署的。

【讨论】:

  • 这是一个 CORS 问题,你是对的。我的连接是通过 PCF 中的另一个服务路由的,这给了我一个“'Access-Control-Allow-Origin' 标头包含多个值”,因为这两个服务中都存在 CORS 过滤器。然后我从 cde-service 中删除了 CORS 过滤器,我开始收到“403 Forbidden”。一旦我在 cde-service 上再次添加了 CORS 过滤器并尝试使用直接 url 连接到 cde-service,连接就成功了。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2020-02-04
  • 2012-04-19
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多