HTTPS 发送请求出现TLS握手失败

最近在工作中,调外部接口,发现在clientHello步骤报错,服务端没有返回serverHello。

从网上找了写方法,都没有解决;

在idea的vm options加上参数:

-Djavax.net.debug=SSL,handshake 
把SSL和handshake的日志打印出来;

看到的异常日志如下:

"ClientHello": {"client version"      : "TLSv1.2","random"              : "6A 07 F0 0E B6 96 23 B2 35 2D CD 3E 2B 7B D2 E5 14 B8 43 A9 44 24 0C B8 62 29 AD C5 7A C4 EE 16","session id"          : "82 48 DC 04 FA CF 39 4B BF 38 52 7F 4E B7 42 ED DD 48 4F 38 CA 9E 68 96 39 79 AA 2E B4 A4 2E FB","cipher suites"       : "[TLS_AES_256_GCM_SHA384(0x1302), TLS_AES_128_GCM_SHA256(0x1301), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]","compression methods" : "00","extensions"          : ["server_name (0)": {type=host_name (0), value=},"supported_groups (10)": {"versions": [ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]},"ec_point_formats (11)": {"formats": [uncompressed]},"signature_algorithms (13)": {"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]},"signature_algorithms_cert (50)": {"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]},"extended_master_secret (23)": {<empty>},"supported_versions (43)": {"versions": [TLSv1.3, TLSv1.2]},"psk_key_exchange_modes (45)": {"ke_modes": [psk_dhe_ke]},"key_share (51)": {"client_shares": [  {"named group": ffdhe2048"key_exchange": {0000: 48 B1 7A 2B B0 D1 81 13   EB E1 76 E2 29 8C 1A E3  H.z+......v.)...0010: 04 24 17 44 45 25 F0 1B   07 18 49 D8 5E 33 1D B1  .$.DE%....I.^3..0020: B8 EC 51 29 AA 33 4B 2C   2A 61 BB 45 E7 F4 E2 94  ..Q).3K,*a.E....0030: 95 31 7C 9E B7 28 78 75   C1 68 10 82 E5 77 0C 98  .1...(xu.h...w..0040: 8E F2 69 4A DB 37 0C B7   AE B4 3E D4 A6 6D 79 2B  ..iJ.7....>..my+0050: C7 80 B4 C0 BB C9 AD A1   EF B8 C5 B1 66 75 68 9E  ............fuh.0060: F9 F4 F0 C4 2F E7 E2 4C   12 FC 68 66 59 5D B7 D2  ..../..L..hfY]..0070: 35 0F D2 8E 37 90 1B F0   FD EC 9C 60 16 0C 83 FA  5...7......`....0080: BB 8E 2B 7E F9 C2 5E 06   85 76 95 A1 52 04 EF CB  ..+...^..v..R...0090: EF 44 07 58 2F 2A D5 B2   8D B9 32 11 4D D9 07 65  .D.X/*....2.M..e00A0: D1 C6 F3 40 54 4F 92 48   E5 07 D9 23 42 BE AD 9A  ...@TO.H...#B...00B0: 2D AD 9D AB C0 CA D4 4A   37 5F CC DF B6 3B D2 D8  -......J7_...;..00C0: D0 CE 4F F1 74 92 81 53   C2 B6 77 2C 76 D1 66 A5  ..O.t..S..w,v.f.00D0: 14 21 1A 2B F7 E3 E1 F4   9D 98 D6 8D 9E 32 35 80  .!.+.........25.00E0: 1F 6A 01 D1 DE 31 42 E5   0D 19 F7 67 85 77 4C CC  .j...1B....g.wL.00F0: 2B 62 FD F0 DE 27 68 1D   B1 09 40 83 C7 E4 47 7C  +b...'h...@...G.}},]}]
}
)
javax.net.ssl|FINE|B4|http-nio-8099-exec-1|2024-07-07 10:20:42.945 CST|Alert.java:238|Received alert message (
"Alert": {"level"      : "fatal","description": "handshake_failure"
}
)

最终报出来的错误是:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure;

握手失败。

在别的项目中使用相同的工具类进行调用,使用相同的jdk版本,是可以正常调用的;对比两者的clienthello报文,发现客户端所支持的加密套件是不一样的,调用失败的请求明显少了一些套件;

这是正常请求的报文:

"ClientHello": {"client version"      : "TLSv1.2","random"              : "A6 F3 8F E9 EA 8C 1C 91 D8 33 EC E9 70 3C 12 05 96 63 EF B0 24 7E 09 65 08 50 74 98 A8 65 F3 08","session id"          : "02 31 3F 18 F0 35 E3 B9 15 87 D3 D1 A1 A7 59 E7 DD ED 28 07 1D 56 DF 28 64 B6 82 21 D7 9C 79 E6","cipher suites"       : "[TLS_AES_256_GCM_SHA384(0x1302), TLS_AES_128_GCM_SHA256(0x1301), TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x009F), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0x00A3), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x009E), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0x00A2), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x006B), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x006A), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x0067), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x0040), TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(0xC02E), TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(0xC032), TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(0xC02D), TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(0xC031), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(0xC026), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(0xC02A), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(0xC025), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(0xC029), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x0039), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x0038), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x0033), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x0032), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(0xC005), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(0xC00F), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(0xC004), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(0xC00E), TLS_RSA_WITH_AES_256_GCM_SHA384(0x009D), TLS_RSA_WITH_AES_128_GCM_SHA256(0x009C), TLS_RSA_WITH_AES_256_CBC_SHA256(0x003D), TLS_RSA_WITH_AES_128_CBC_SHA256(0x003C), TLS_RSA_WITH_AES_256_CBC_SHA(0x0035), TLS_RSA_WITH_AES_128_CBC_SHA(0x002F), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0x00FF)]","compression methods" : "00","extensions"          : ["server_name (0)": {type=host_name (0), value=},"supported_groups (10)": {"versions": [secp256r1, secp384r1, secp521r1, ffdhe2048, ffdhe3072, ffdhe4096, ffdhe6144, ffdhe8192]},"ec_point_formats (11)": {"formats": [uncompressed]},"signature_algorithms (13)": {"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]},"signature_algorithms_cert (50)": {"signature schemes": [ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_secp521r1_sha512, rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pss_pss_sha256, rsa_pss_pss_sha384, rsa_pss_pss_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha512, dsa_sha256, ecdsa_sha1, rsa_pkcs1_sha1, dsa_sha1]},"extended_master_secret (23)": {<empty>},"supported_versions (43)": {"versions": [TLSv1.3, TLSv1.2]},"psk_key_exchange_modes (45)": {"ke_modes": [psk_dhe_ke]},"key_share (51)": {"client_shares": [  {"named group": secp256r1"key_exchange": {0000: 04 64 F2 B7 51 E2 D6 1B   11 00 7D 59 58 62 90 3E  .d..Q......YXb.>0010: 03 8F 7C 16 92 D7 EA 81   D3 D1 3C 58 4E 4F 29 20  ..........<XNO) 0020: 1B 49 EA AD 84 D1 B6 60   77 77 77 90 60 C5 50 98  .I.....`www.`.P.0030: 50 CC 48 D3 8E 12 B6 11   A3 AE 43 24 7F 66 AE 9B  P.H.......C$.f..0040: EB }},]}]
}
)
javax.net.ssl|FINE|01|main|2024-07-07 10:26:02.678 CST|ServerHello.java:863|Consuming ServerHello handshake message (
"ServerHello": {"server version"      : "TLSv1.2","random"              : "D4 8E 8D 8D D9 07 97 2B 7E 17 55 36 14 D3 14 9D 77 20 55 13 67 0E F1 61 B9 AA 1F 49 3D B6 A4 07","session id"          : "4E EE F7 CA B5 B1 AB C9 7D 79 0B 9E AC 21 84 1D EE C7 E8 66 C7 E3 D9 F3 DC 61 79 FF 7D 59 05 72","cipher suite"        : "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030)","compression methods" : "00","extensions"          : ["renegotiation_info (65,281)": {"renegotiated connection": [<no renegotiated connection>]},"server_name (0)": {<empty extension_data field>},"ec_point_formats (11)": {"formats": [uncompressed, ansiX962_compressed_prime, ansiX962_compressed_char2]},"extended_master_secret (23)": {<empty>}]
}
)

两者对比可以发现,服务端选择了TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384加密套件,正常请求是有这个套件的,而失败的请求是没有这个套件的;

解释一下这个加密套件:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 是一个提供强安全性的加密套件,它结合了ECDHE密钥交换的前向安全性、RSA的广泛接受度、AES_256_GCM的高效加密和认证能力以及SHA384的强哈希功能。这种套件通常用于需要高安全性的通信,例如金融服务、政府通信或其他敏感数据传输。

  • ECDHE: 椭圆曲线Diffie-Hellman密钥交换(Elliptic Curve Diffie-Hellman Ephemeral)。这是一种密钥交换机制,使用椭圆曲线加密算法来生成一个临时的共享密钥,用于加密会话密钥。

可以简单理解,这是个ECC的椭圆机密曲线,那有没有可能就是因为项目的某些配置导致ECC椭圆加密曲线缺失了;

我本人对这个方面的研究不深,到达了我的知识盲区,刚好身边有个博士做过这方面的研究,他所在的团队实现了TLS1.3的一个版本,对这个非常熟悉,请他看了一下日志,可以判断,也是缺少椭圆曲线;

既然大概确定是缺少某些东西导致调用报错,那就想办法把原因找出来;

经过了一天的努力,终于发现了问题所在,之前有个哥们不知道因为什么原因,把SUN公司的ECC曲线都删掉了,导致了问题;

现在公布这个罪魁祸首:

    static {Security.removeProvider("SunEC");}

问了KIMI,它的回答是这样的:

在Java中,Security 类是 java.security 包的一部分,它提供了一些管理安全属性和访问安全服务的方法。Security 类中的 removeProvider 方法用于从安全框架中移除一个已经注册的提供者。这里的 "SunEC" 是一个提供者的名称,它代表Sun公司提供的椭圆曲线加密(ECC)服务。椭圆曲线加密是一种基于椭圆曲线数学的公钥密码体系,它在TLS握手中用于密钥交换和数字签名等操作。在TLS握手过程中,如果客户端和服务器都支持ECC,它们可能会选择使用基于ECC的加密套件来进行通信,因为它们通常提供与RSA相比更高的安全性,并且密钥尺寸更小。当你执行 Security.removeProvider("SunEC") 这行代码时,你告诉Java安全框架不再使用 "SunEC" 提供者的服务。这可能导致以下问题:移除关键加密服务:
如果"SunEC"提供者是用于TLS握手中ECC相关操作的唯一提供者,那么移除它可能会导致Java虚拟机无法使用ECC加密套件,这可能违反了客户端和服务器之间的安全协议。TLS握手失败:
如果客户端尝试使用ECC加密套件与服务器进行握手,但服务器期望使用"SunEC"提供者支持的特定加密算法,而该提供者已被移除,这可能导致握手失败。兼容性问题:
某些TLS库或服务器可能特别依赖于特定的加密提供者。移除"SunEC"可能会影响到这些库或服务器的兼容性。安全漏洞:
如果你的应用程序依赖于ECC提供的安全性,移除"SunEC"提供者可能会降低安全性,使应用程序容易受到某些类型的攻击。配置错误:
如果"SunEC"提供者被用于支持某些特定的业务逻辑或安全策略,移除它可能会导致应用程序行为不符合预期。要解决这个问题,你可以考虑以下步骤:审查代码:
检查为什么需要移除"SunEC"提供者,是否有其他方式可以实现相同的目标,而不需要移除整个提供者。错误日志:
查看TLS握手失败的错误日志,了解具体是哪个步骤失败了,以及是否与ECC相关。恢复提供者:
如果确定移除"SunEC"是导致问题的原因,尝试恢复它,看看是否能解决问题。更新依赖:
如果你的应用程序依赖于特定的加密库或版本,确保这些依赖是最新的,并且与你的Java版本兼容。联系服务提供者:
如果问题依然存在,可能需要联系服务提供者或寻求专业的技术支持。在处理这类问题时,重要的是要理解你的应用程序对特定加密服务的依赖程度,以及这些服务如何与TLS握手过程相互作用。

接下来的工作就是看要不要删除这行代码,删除之后会不会对以前的功能有影响,需要回归测试。

这个问题困扰了我好久,感觉http、https吃得不透啊,需要去看一下《TCP/IP详解》这种经典了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建基于Spring Cloud的微服务监控系统

构建基于Spring Cloud的微服务监控系统 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 随着微服务架构的流行&#xff0c;应用程序变得更加复杂和分布式&…

python自动化办公之cryptography加密解密

目录 用到的库 实现效果 代码部分 1、加密2024.txt文件 2、解密2024.txt文件 用到的库 cryptography 实现效果 加密文件和解密文件 代码部分 1、加密2024.txt文件 # 加密 from cryptography.fernet import Fernet # 生成加密密钥 keyFernet.generate_key() cipher_s…

go语言中使用WaitGroup和channel实现处理多线程问题

WaitGroup 背景 如果将一个任务分为任意个小任务&#xff0c;并且不关心小任务的执行顺序&#xff0c;并且希望等待全部的小任务执行完成后再去操作后面的逻辑&#xff0c;那我推荐你用sync.WaitGRoup 使用方法 比如&#xff0c;有一个任务需要执行 3 个子任务&#xff0c;…

Raw Socket(一)实现TCP三次握手

实验环境&#xff1a; Windows物理机&#xff1a;192.168.1.4 WSL Ubuntu 20.04.6 LTS&#xff1a;172.19.32.196 Windows下的一个http服务器&#xff1a;HFS&#xff0c;大概长这个样子&#xff1a; 客户端就是Ubuntu&#xff0c;服务端就是这个…

收银系统源码-线上商城预售功能

1.功能描述 预售&#xff1a;智慧新零售收银系统&#xff0c;线上商城营销插件之一&#xff0c;商品出售时可设置以支付定金或全款的方式提前预售&#xff0c;门店按订单量备货&#xff0c;降低压货成本&#xff1b; 2.适用场景 易损商品提前下单备货&#xff0c;如水果生鲜…

【算法笔记自学】第 5 章 入门篇(3)——数学问题

5.1简单数学 #include <cstdio> #include <algorithm> using namespace std; bool cmp(int a,int b){return a>b; } void to_array(int n,int num[]){for(int i0;i<4;i){num[i]n%10;n /10;} } int to_number(int num[]){int sum0;for(int i0;i<4;i){sumsu…

C++ Lambda表达式第二篇, Lambda表达式

C Lambda表达式 Lambda 捕获含有模板参数的Lambda表达式无模板参数的Lambda表达式 Lambda 捕获 captures是零个或多个捕获的逗号分隔列表&#xff0c;可以选择以capture-default开头。捕获列表定义可从 lambda 函数体内访问的外部变量。唯一的捕获默认值是 &&#xff0c;…

Kylin系列(二)架构解析:深入理解 Kylin 的架构设计

目录 1. 引言 2. Kylin 的基本概念 2.1 预计算 2.2 多维数据集&#xff08;Cube&#xff09; 2.3 维度和度量 3. Kylin 的架构设计 3.1 数据源 3.2 数据建模 3.2.1 星型模型 3.2.2 雪花模型 3.3 多维数据集构建 3.3.1 数据导入 3.3.2 维度和度量计算 3.3.3 存储优…

AI微电影制作教程:轻松打造高清小人国画面

AI微电影作为一种新兴的视频内容形式&#xff0c;以其独特的视觉效果和制作技术在各大视频平台上取得了显著的流量表现。 2. AI微电影的特点 2.1 高清画质与流畅动作&#xff1a;AI微电影以其高分辨率和流畅的动作给观众带来优质的视觉体验。 2.2 微缩画面效果&#xff1a;独…

大数据面试题之Presto[Trino](6)

如何诊断Presto查询慢的问题&#xff1f; 诊断Presto查询慢的问题通常需要一个系统化的方法&#xff0c;结合监控、日志分析、查询优化策略和系统配置调整等多个方面。以下是一些具体的步骤和建议&#xff1a;1、查看Presto Dashboard&#xff1a; 登录Presto的Web UI&#xf…

WebKit 入门案例教程

WebKit 的基本概念 1.什么是 WebKit&#xff1f;&#xff1a;WebKit 是一个开源的浏览器引擎&#xff0c;用于渲染 HTML、CSS 和 JavaScript 等内容。 2.WebKit 的组件&#xff1a;WebKit 的组件包括 HTML 解析器、CSS 解析器、JavaScript 引擎、布局引擎等。 3.WebKit 的应用…

用 adb 来模拟手机插上电源和拔掉电源的情形

实用的 ADB 命令 要模拟手机从 USB 充电器上拔掉的情形&#xff0c;你可以使用&#xff1a; adb shell dumpsys battery set usb 0或者&#xff0c;如果你使用的是 Android 6.0 或更高版本的设备&#xff0c;你可以使用&#xff1a; adb shell dumpsys battery unplug要重新…

使用Docker、Docker-compose部署单机版达梦数据库(DM8)

安装前准备 Linux Centos7安装&#xff1a;https://blog.csdn.net/andyLyysh/article/details/127248551?spm1001.2014.3001.5502 Docker、Docker-compose安装&#xff1a;https://blog.csdn.net/andyLyysh/article/details/126738190?spm1001.2014.3001.5502 下载DM8镜像 …

三种 FRR 技术演进 LFA、rLFA、Ti-LFA

FRR&#xff1a;Fast ReRoute 快速重路由&#xff0c;是为最大程度地减少流量损失&#xff0c;路由器预先安装一条备份路径&#xff0c;当故障发生的时候&#xff0c;由邻近故障点的路由器&#xff08;PLR&#xff1a;Point of Local Repair&#xff0c;本地修复节点&#xff0…

在Java Web项目中遇到过哪些技术难题以及如何解决的

在Java Web项目中&#xff0c;开发者可能会遇到多种技术难题。这些难题可能涉及框架使用、性能优化、安全性、数据库交互、前后端交互等多个方面。以下是一些常见的技术难题及其可能的解决方案&#xff1a; 1. 框架使用问题 难题&#xff1a; Spring Boot、Spring MVC等框架…

自动控制:前馈控制

自动控制&#xff1a;前馈控制 前馈控制是一种在控制系统中通过预先计算和调整输入来应对已知扰动或变化的方法。相比于反馈控制&#xff0c;前馈控制能够更快速地响应系统的变化&#xff0c;因为它不依赖于系统输出的反馈信号。前馈控制的应用在工业过程中尤为广泛&#xff0…

银河麒麟(V10SP1)-arm版交叉编译-qt-5.12.12源码

前言 确实是编译出来了qtbase库和qtwebengine库&#xff0c;如果按照文章没有操作出来有两种情况 (1) 读者阅读不仔细 (2) 我后期记录整理时写错了 不完美之处和遗留问题 读者阅读前须知 1. 最后发现没有生成libqxcb库文件,如果在国产化系统上执行qt程序时依赖的是自己编译…

element-ui输入框如何实现回显的多选样式?

废话不多说直接上效果&#x1f9d0; 效果图 <template><div><el-form:model"params"ref"queryForm"size"small":inline"true"label-width"68px"><el-form-item label"标签" prop"tag&q…

基于java+springboot+vue实现的仓库管理系统(文末源码+lw+ppt)23-499

第1章 绪论 伴随着信息社会的飞速发展&#xff0c;仓库管理所面临的问题也一个接一个的出现&#xff0c;所以现在最该解决的问题就是信息的实时查询和访问需求的问题&#xff0c;以及如何利用快捷便利的方式让访问者在广大信息系统中进行查询、分享、储存和管理。这对我们的现…

微积分-导数5(链式法则)

链式法则 假设你想求下面的函数的导数 f ( x ) x 2 1 f(x) \sqrt{x^2 1} f(x)x21 ​ 之前学到的微分法则没求 F ′ ( x ) F(x) F′(x)。 我们观察到 F F F 是一个复合函数。实际上&#xff0c;如果我们令 y f ( u ) u y f(u) \sqrt{u} yf(u)u ​ 并且 u g ( x ) …