当前位置: 首页 > 知识库问答 >
问题:

通过https建立SSE连接失败-如何解决

曾晨
2023-03-14

据我所知,要建立事件流,必须在客户端上创建一个事件源对象,并将其传递给服务器以注册自己。服务器在收到此请求后,适当地设置响应标头并按照事件流格式发送数据。我设置了这个流,它可以通过超文本传输协议工作,但在向服务器添加SSL后,事件流正在创建,服务器会抛出501-未实现错误。经过一些研究,我认为这可能是CORS问题,并添加了适当的标头,但这也没什么不同。我还尝试了通常适用于501个错误的小修复,例如清除浏览器缓存和禁用任何代理设置。我对此完全感到困惑,如果有人能帮助我了解问题以及修复它的最佳方法,我将不胜感激。

编辑:

客户端通过aws elb负载平衡器向服务器发送请求,该负载平衡器从请求中剥离ssl并将请求转发给服务器。除CORS相关问题外,服务器抛出501错误的另一个可能原因是请求被更改。

当负载平衡器在将SSL转发到服务器之前从请求中删除SSL时,是否可能以某种方式更改sse请求,从而导致服务器抛出错误?如何监视传入负载平衡器的请求和转发的请求?此外,经过进一步研究,我了解到内部服务器端事件本质上是HTTP流的一种形式。即使在发送数据之后,请求仍保持打开状态,直到客户端显式关闭为止。考虑到我的第一个预感是错误的,SSL被剥离并转发到服务器,而不改变请求,服务器发送响应头和心跳信号以保持连接的活动性。

这是否意味着流也被加密了?服务器是用Koa编写的。sse注册endpoint如下所示:

共有1个答案

柴博
2023-03-14
// node.js

const SseStream = require('ssestream');

console.log('SseStream', SseStream)

const MyService = {
   doSomeStuff: () => {return 222}
}


public async someFunctionInRouter(req,res) {
    const origin = req.get('origin') || '';
    const sseStream = new SseStream(req);

    res.setHeader('Access-Control-Allow-Origin', origin);
    res.setHeader('Access-Control-Allow-Credentials', 'true');
    res.on('end', () => {
      console.log("res.on('end'");
    });
    res.on('close', () => {
      console.log("res.on('close'");
      sseStream.unpipe(res);
    });
    res.on('error', ee => {
      console.log("res.on('error'", ee);
      sseStream.write({
        id: 3,
        event: 'myCustomEvent',
        data: {
          errors: [ee]
        }
      });
    });
    sseStream.pipe(res);



    const result = await MyService.doSomeStuff(999, 888)
      .catch(e => {
        console.error('error', e);
        sseStream.write({
          id: 2,
          event: 'myCustomEvent',
          data: {
            errors: [e]
          }
        });
      });

    sseStream.on('end', (eeee: any) => {
      console.log('sseStream.on error', eeee);
    });
    sseStream.on('error', (eeee: any) => {
      console.log('sseStream.on error', eeee);
    });
    sseStream.on('close', (eeee: any) => {
      console.log('sseStream.on close', eeee);
    });

    sseStream.write({
      id: 1,
      event: 'myCustomEvent',
      data: result
    });

    res.end();
  }
 类似资料:
  • 我正在尝试使用JaxWsProxyFactoryBean连接到TLS1。2通过代理使用Spring Boot和java配置的https服务。我找不到任何示例,也找不到有关如何配置的信息。我使用wsdl2java构建最终从JaxWsProxyFactoryBean返回的所有对象。任何帮助都将不胜感激。我目前拥有: 和 我目前收到一个错误: 任何帮助都将不胜感激。 谢谢,布莱恩

  • 假设我用SSL配置了我的NGINX服务器,并且我能够建立并保持与Rails服务器的服务器发送事件连接。从Rails到我的浏览器的每一条信息都是互联网上任何窥探者都无法解读的吗。此外,我甚至能够建立这样的联系吗?因为我听说SSE是通过http工作的。

  • 问题内容: 我正在与一个名为CommWeb的商户帐户集成,并向其URL(https://migs.mastercard.com.au/vpcdps)发送一个SSL帖子。当我尝试发送帖子时,出现以下异常: 执行该帖子的代码(我没有写过,并且已经存在于我们的代码库中)是: 商户帐户集成的文档对证书一无所知。他们确实提供了一些似乎盲目接受证书的示例JSP代码: 我们的Web应用程序有一个密钥库,我尝试使

  • 我已经从一台没有SSL的机器连接了一个JMX连接。但是当我给出SSL时,尽管应用程序没有任何错误地启动,VisualVM无法通过指定的端口建立JMX连接。下面是我用来从应用程序端建立JMX连接的命令。 java-dcom.sun.management.jmxremote.port=4444-dcom.sun.management.jmxremote.password.file=“C://Progr

  • 今天我下载并安装了最新的Neo4j Windows桌面。我没有从默认值中更改任何配置。当我试图在Chrome中打开浏览器http://localhost:7474/browser/时,我可以连接,但试图登录时显示错误: ServiceUnavailable:WebSocket连接失败。由于web浏览器中的安全限制,此Neo4j驱动程序无法提供故障原因。请使用浏览器开发控制台确定故障的根本原因。常见

  • 问题内容: 我有一个使用socket.IO的node.js应用程序。它可以在http上正常工作,但是当尝试通过https连接到套接字时,没有任何反应。 这是代码的一部分: 和功能: 客户端连接如下: 正如我说的,在http上一切正常,但是在https上连接会给我“连接被中断”。我究竟做错了什么? 问题答案: 您不能像服务器那样初始化服务器。您必须启动一个单独的https服务器,然后将socket.