Websockets连接在Pivotal Cloud上失败,但在localhost上有效

时间:2018-07-20 21:06:15

标签: stomp spring-websocket pivotal-cloud-foundry sockjs

我有一个名为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-app:

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'
  }));

1 个答案:

答案 0 :(得分: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,咳嗽)不支持通过同一端口进行HTTP,HTTPS和WebSockets通信。要解决此负载平衡器限制,运营商将为每个协议使用单独的端口,即HTTP-> 80,HTTPS 443,WSS4443。请与您的平台运营商联系,以了解如何部署环境。