当前位置: 首页 > news >正文

【问题处理】海康视频websocket代理问题(websocket在业务系统https协议下调用海康ws协议)

简介

本文记录一次海康视频代理websocket 在https业务系统环境下调用海康服务ws协议的问题。

问题描述

起初前端组件展示视频时,业务系统使用的环境是https,此时海康服务调用时,使用的是ws协议,最后前端控制台报错:

Failed to construct 'WebSocket':An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

明显是https协议的安全控制,需要通过nginx进行代理,通过观察发现,海康插件会调用类似下面这样一段ws服务地址:

ws://IP:PORT/media?version=1.0&cipherSuites=0&sessionID=

先让让前端将ws修改为wss协议,然后由后台nginx进行代理,这里由于是海康的内部代码行为,因此nginx只能对media关键字捕获从而进行代理,如下是代理节:

  upstream  haikangstream {server ip:port; # 此处对应原海康ws请求地址}server {....location /media {proxy_pass http://haikangstream;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}
}

如此配置后按理说应该没问题,不过前端调用过程中发现,有时候某些视频能正常播放,但极大概率由视频播放不正常,失败的视频请求时nginx报错:

2024/07/31 14:01:35 [error] 445170#0: *298 recv() failed (104: Connection reset by peer) while reading 
response header from upstream, client: 192.168.20.165, server: localhost:18000, 
request: "GET /media?version=1.0&cipherSuites=0&sessionID=&proxy=wss: HTTP/1.1", 
upstream: "http://x.x.x.x:p/media?version=1.0&cipherSuites=0&sessionID=&proxy=wss:",host: "192.168.20.x:xx000"

其中X是敏感屏蔽,若影响观感,还请见谅。

仔细观察发现代理后的低值http://x.x.x.x:p/media?version=1.0&cipherSuites=0&sessionID=&proxy=wss:最后的传参proxy不太正常,对比原请求ws://IP:PORT/media?version=1.0&cipherSuites=0&sessionID=尝试让前端在海康插件js中找到此处代码,将proxy拼接参数逻辑去除,即不传递此参数,重启前端,视频播放正常。

总结

处理该问题几乎花了一天的时间,但是感觉都不是技术上的问题,不知道海康api有什么考虑,但还是站在无知者的角度建议遇到这个问题之后应该采取的方案:

  1. 建议海康组件此处应考虑对wss协议的兼容。
  2. 修改前端js代码处对proxy拼接逻辑,同时nginx对media请求进行代理。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 想提交BCSP小高组T4的同学请看这里~
  • 链接器找不到一些ACADO库中的函数定义,导致未定义引用的错误。
  • Leetcode 3143. 正方形中的最多点数(二分、数组字符串、位运算集合)
  • 函数function3
  • 解决Firefox代理身份验证弹出窗口问题:C#和Selenium实战指南
  • 量化金融人都在看哪些顶刊
  • C#--DirectShowLib 关闭自动白平衡和自动曝光时间
  • MATLAB基础操作(二)
  • Vue Router 详解:让你的单页面应用(SPA)畅行无阻
  • Flink 实时数仓(五)【DWD 层搭建(三)交易域事实表】
  • 数据结构与算法 - 优先级队列、阻塞队列
  • 我对于内存相关的三个问题的理解和总结——内存泄漏、内存溢出、野指针
  • 宏景eHR /ajax/ajaxService SQL注入漏洞复现
  • 【时时三省】unity test 测试框架 使用 code blocks 移植
  • 如何解决C#字典的线程安全问题
  • 《深入 React 技术栈》
  • Angular Elements 及其运作原理
  • E-HPC支持多队列管理和自动伸缩
  • es6(二):字符串的扩展
  • Git的一些常用操作
  • Lsb图片隐写
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • SQLServer之索引简介
  • tensorflow学习笔记3——MNIST应用篇
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 写给高年级小学生看的《Bash 指南》
  • C# - 为值类型重定义相等性
  • # Kafka_深入探秘者(2):kafka 生产者
  • #1014 : Trie树
  • #在 README.md 中生成项目目录结构
  • (11)MSP430F5529 定时器B
  • (33)STM32——485实验笔记
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (十三)Flask之特殊装饰器详解
  • (四)opengl函数加载和错误处理
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .describe() python_Python-Win32com-Excel
  • .FileZilla的使用和主动模式被动模式介绍
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .Net中的集合
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [12] 使用 CUDA 加速排序算法
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [acm算法学习] 后缀数组SA
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解
  • [Android View] 可绘制形状 (Shape Xml)
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [BZOJ1060][ZJOI2007]时态同步 树形dp