总结:使用JDK原生HttpsURLConnection,封装HttpsUtil工具类,加载自定义证书验证,忽略ssl证书验证
总结:使用JDK原生HttpsURLConnection,封装HttpsUtil工具类,加载自定义证书验证,忽略ssl证书验证
- 一·HttpsUtil工具类
- 二·SSLUtil工具类
一·HttpsUtil工具类
package com.example.util;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;/*** https请求工具类*/
public class HttpsUtil {private static int timeOut = 60000; // https超时时间public static void main(String[] args) throws IOException {//测试默认的受信任根证书,https请求
// String s = doGet("https://blog.csdn.net/weixin_48033662?spm=1010.2135.3001.5343");
// System.out.println(s);//测试自定义受信任证书的https请求String s2 = doGet("https://localhost:8443/hello","/Users/ideal/私人文件夹/JavaProjects/springboot3-multi-module-demo/SpringBoot-https-demo/src/main/resources/public_cert.pem");System.out.println(s2);}/*** get请求,不能访问加密URL* 使用自定义受信任的根证书** @param urlAddress https地址* @param certPath 本地证书路径* @return* @author LiuMingFu* @date 2025/2/14*/public static String doGet(String urlAddress, String certPath) {try {/*** 1. 封装自定义的受信任CA证书** 作用:创建一个CertificateFactory对象,用于处理X.509格式的证书(自签证书模式)。* 说明:X.509是一种标准的证书格式,常用于SSL/TLS通信。*/CertificateFactory cf = CertificateFactory.getInstance("X.509");//从指定路径加载PEM格式的证书文件,并将其转换为X509Certificate对象X509Certificate caCert = (X509Certificate) cf.generateCertificate(//读取自签证书文件new FileInputStream(certPath));/*** 2. 创建KeyStore并加载CA证书** 作用:创建一个KeyStore对象,用于存储证书和密钥。* 说明:KeyStore.getDefaultType()返回默认的密钥库类型(通常是JKS或PKCS12)。*/KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());/*** 作用:初始化KeyStore对象。** 第一个参数为null,表示不加载现有的密钥库文件。* 第二个参数为null,表示使用默认密码。*/keyStore.load(null, null);//将证书添加到KeyStore中。"caCert":证书的别名,用于标识证书keyStore.setCertificateEntry("caCert", caCert);/*** 3. 创建一个TrustManagerFactory对象,用于管理信任的证书* TrustManagerFactory.getDefaultAlgorithm()返回默认的算法(通常是PKIX)*/TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());/*** 作用:使用KeyStore初始化TrustManagerFactory。* 说明:keyStore中存储的证书将被用于验证服务器的证书。*/tmf.init(keyStore);//4.创建一个SSLContext对象,用于管理SSL/TLS协议的配置。TLS是SSL的升级版,目前广泛使用SSLContext sc = SSLContext.getInstance("TLS");/*** 初始化SSLContext* 第一个参数为null,表示不使用客户端证书。* 第二个参数为tmf.getTrustManagers(),表示使用TrustManagerFactory生成的信任管理器。* 第三个参数为null,表示使用默认的随机数生成器。*/sc.init(null, tmf.getTrustManagers(), null);//5. 设置默认的SSLSocketFactory,所有后续的HttpsURLConnection请求都会使用这个SSLSocketFactory来建立SSL/TLS连接。HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());// 6. 发起HTTPS请求URL url = new URL(urlAddress);HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);/*** 创建一个BufferedReader对象,用于读取服务器的响应内容。* connection.getInputStream():获取服务器的输入流。* InputStreamReader:将字节流转换为字符流。* BufferedReader:提供缓冲功能,提高读取效率*/BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();//逐行读取响应内容并拼接到response中,in.readLine()读取一行内容,直到返回null(表示读取完毕)while ((inputLine = in.readLine()) != null) {response.append(inputLine);}//关闭流in.close();System.out.println("Response Content: " + response.toString());return response.toString();} catch (Exception e) {e.printStackTrace();}return null;}/*** get请求,不能访问加密URL* 使用默认的受信任根证书** @param requestURL 请求地址* @return 响应结果* @throws IOException*/public static String doGet(String requestURL) throws IOException {BufferedReader inReader = null;InputStream in = null;String responseBody = "";try {//创建url地址URL url = new URL(requestURL);//使用https类型的url连接对象HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();//设置连接超时conn.setConnectTimeout(timeOut);//设置读取超时conn.setReadTimeout(timeOut);//设置请求方法,必须大写conn.setRequestMethod("GET");//设置请求头信息conn.setRequestProperty("Content-Type", "application/json");/** connect()会根据HttpURLConnection对象的配置值生成HTTP头部信息,且建立tcp连接,但是没有发送http请求* 所有的配置信息,都必须在connect()方法之前添加,后面的添加不进去。*/conn.connect();/** 开始发起get类型http请求,获取响应数据*///实际发送url的http请求if (HttpsURLConnection.HTTP_OK == conn.getResponseCode()) {//获取正常响应流in = conn.getInputStream();} else {//获取异常响应流in = conn.getErrorStream();}//读取响应内容inReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();int len;char[] tmp = new char[256];while ((len = inReader.read(tmp)) > 0) {sb.append(tmp, 0, len);}responseBody = sb.toString();} catch (Exception e) {e.printStackTrace();} finally {if (inReader != null) {inReader.close();}if (in != null) {in.close();}}return responseBody;}/*** post请求,不能访问加密URL* 使用默认的受信任根证书** @param requestURL 请求地址* @param body 请求体* @return 响应结果* @throws IOException*/public static String doPost(String requestURL, String body) throws IOException {BufferedReader inReader = null;InputStream in = null;String responseBody = "";OutputStream outputStream = null;BufferedWriter writer = null;try {//创建链接地址URL url = new URL(requestURL);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();//设置是否允许从httpUrlConnection读取数据,默认是trueconn.setDoInput(true);//设置是否向httpUrlConnection输出参数,因为这个是post请求,所以必须开启conn.setDoOutput(true);//设置连接超时conn.setConnectTimeout(timeOut);//设置读取超时conn.setReadTimeout(timeOut);//设置请求方法,必须大写conn.setRequestMethod("POST");//设置请求头信息conn.setRequestProperty("Content-Type", "application/json");/** connect()会根据HttpURLConnection对象的配置值生成HTTP头部信息,且建立tcp连接,但是没有发送http请求* 所有的请求头配置信息,都必须在connect()方法之前添加,后面的添加不进去。*/conn.connect();/** 往post连接里面写入必要的请求体-参数*///获取conn的输出流outputStream = conn.getOutputStream();//将字节流转换为字符流writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));//往连接中写入参数,body可以是name=lmf&age=23键值对拼接形式,也可以是json字符串形式writer.write(body);//必须刷新流空间的数据writer.flush();/** 开始发起post类型http请求,获取响应数据*///实际发送url的http请求if (HttpsURLConnection.HTTP_OK == conn.getResponseCode()) {//获取正常响应流in = conn.getInputStream();} else {//获取异常响应流in = conn.getErrorStream();}//读取响应内容inReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();int len;char[] tmp = new char[256];while ((len = inReader.read(tmp)) > 0) {sb.append(tmp, 0, len);}//最终响应内容字符串responseBody = sb.toString();} catch (Exception e) {e.printStackTrace();} finally {if (writer != null) {writer.close();}if (outputStream != null) {outputStream.close();}if (inReader != null) {inReader.close();}if (in != null) {in.close();}}return responseBody;}}
二·SSLUtil工具类
package com.example.util;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;/*** @Description TODO* <p>* @Author LiuMingFu* @Date 2024/1/8 13:59*/
public class SSLUtil {public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException, IOException {//忽略单个https连接的证书校验URL url = new URL("https://localhost:8443/hello");HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setRequestMethod("GET");// 仅忽略当前连接的SSL验证SSLUtil.trustSSLCertificatesByOneConnect(conn);// 读取响应码int code = conn.getResponseCode();System.out.println("Response Code: " + code);// 读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder response = new StringBuilder();String inputLine;while ((inputLine = reader.readLine()) != null) {response.append(inputLine);}reader.close();System.out.println("Response Content: " + response.toString());System.out.println("========================================================================================");// 全局忽略HTTPS证书校验,下面所有的https请求都会忽略证书校验SSLUtil.trustAllSSLCertificates();String s = HttpsUtil.doGet("https://localhost:8443/hello");System.out.println(s);}/*** 演示:忽略HTTPS证书校验流程** @param args*/public static void main2(String[] args) {try {// 1. 创建 TrustAllManagerTrustManager[] trustAllCerts = new TrustManager[]{new TrustAllManager()};// 2. 初始化 SSLContextSSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new java.security.SecureRandom());// 3. 设置默认的 SSLSocketFactoryHttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());// 4. 设置默认的 HostnameVerifier,接受所有主机名HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);// 5. 发起 HTTPS 请求URL url = new URL("https://localhost:8443/hello");HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();System.out.println("Response Content: " + response.toString());} catch (Exception e) {e.printStackTrace();}}/*** 针对全局所有https连接,忽略ssl校验** @return* @author LiuMingFu* @date 2024/1/8*/public static void trustAllSSLCertificates() throws NoSuchAlgorithmException, KeyManagementException {//创建证书数组TrustManager[] trustAllCerts = new TrustManager[1];//设置一个忽略ssl校验的证书管理器trustAllCerts[0] = new TrustAllManager();//获取一个ssl实例,并初始化设置证书数组等等SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, null);//设置ssl连接socket流处理工厂类HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());//ssl协议域名校验,默认直接true,相当于忽略ssl校验HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String urlHostName, SSLSession session) {return true;}});}/*** 针对单个连接,忽略https的ssl校验** @param connection https连接对象* @return* @author LiuMingFu* @date 2024/1/8*/public static void trustSSLCertificatesByOneConnect(URLConnection connection) throws NoSuchAlgorithmException, KeyManagementException {HttpsURLConnection httpsURLConnection = (HttpsURLConnection) connection;//创建证书数组TrustManager[] trustAllCerts = new TrustManager[1];//设置一个忽略ssl校验的证书管理器trustAllCerts[0] = new TrustAllManager();//获取一个ssl实例,并初始化设置证书数组等等SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, null);//设置ssl连接socket流处理工厂类httpsURLConnection.setSSLSocketFactory(sc.getSocketFactory());//ssl协议域名校验,默认直接true,相当于忽略ssl校验httpsURLConnection.setHostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String urlHostName, SSLSession session) {return true;}});}/*** 证书管理实现类,该类会对客户端、服务端进行各种校验,这里直接默认全部通过** @author LiuMngFu* @return a* @date 2024/1/8*/private static class TrustAllManager implements X509TrustManager {/*** 返回受信任的CA证书数组* 这里返回 null,表示不限制任何CA证书(即接受所有证书)** @return* @author LiuMingFu* @date 2025/2/14*/@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}/*** 验证服务器证书是否受信任* 这里方法体为空,表示不进行任何验证(即信任所有服务器证书),这种做法会绕过服务器的证书验证,通常用于测试环境或信任特定服务器时。** @param certs:服务器提供的证书链。* @param authType:认证类型(如 RSA、DSA 等)* @return* @author LiuMingFu* @date 2025/2/14*/@Overridepublic void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {}/*** 验证客户端证书是否受信任* 这里方法体为空,表示不进行任何验证(即信任所有客户端证书),这种方法通常用于双向认证(mTLS)场景,但在这里没有实际验证逻辑** @param certs:客户端提供的证书链。* @param authType:认证类型(如 RSA、DSA 等)* @return* @author LiuMingFu* @date 2025/2/14*/@Overridepublic void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {}}
}
相关文章:
总结:使用JDK原生HttpsURLConnection,封装HttpsUtil工具类,加载自定义证书验证,忽略ssl证书验证
总结:使用JDK原生HttpsURLConnection,封装HttpsUtil工具类,加载自定义证书验证,忽略ssl证书验证 一HttpsUtil工具类二SSLUtil工具类 一HttpsUtil工具类 package com.example.util;import javax.net.ssl.HttpsURLConnection; impo…...

重新定义人机关系边界,Soul以AI社交构建多元社交元宇宙
近年来,AI Native应用的兴起已逐渐成为大众关注的焦点。在此背景下,Soul App的首席技术官陶明在极客公园IF2025创新大会上,发表了一场主题为“人机关系的新边界,Soul如何定义AI社交未来”的演讲。他分享了Soul在人工智能领域内的最新技术进展和战略规划,同时也将Soul社交元宇宙…...
HTTP 参数污染(HPP)详解
1. 什么是 HTTP 参数污染(HPP)? HTTP 参数污染(HTTP Parameter Pollution,简称 HPP)是一种 Web 应用攻击技术,攻击者通过在 HTTP 请求中注入多个相同的参数来绕过安全控制或篡改应用逻辑&#…...
阿里云轻量服务器docker部署nginx
拉取nginx docker镜像 sudo docker pull nginx创建以下挂载目录及文件 用户目录下:conf html logs conf: conf.d nginx.conf html: index.html conf.d: default.confnginx.conf添加文件内容 events {worker_connections 1024; }http {include /etc/ngi…...
(萌新入门)如何从起步阶段开始学习STM32 —— 我应该学习HAL库还是寄存器库?
概念 笔者下面需要介绍的是库寄存器和HAL库两个重要的概念,在各位看完之后,需要决定自己的学习路线到底是学习HAL呢?还是寄存器呢?还是两者都学习呢? 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作…...
Windchill开发-电子仓相关对象信息查询SQL
电子仓相关对象信息查询SQL 一、说明二、数据表信息三、数据表字段说明3.1 HOLDERTOCONTENT3.1.1 对象类型3.1.2 存储类型 3.2 APPLICATIONDATA3.2.1 类别3.2.2 与对象的角色关系3.2.3 存储方式3.2.4 其他字段 3.3 URLDATA3.4 STREAMDATA3.5 FVITEM3.6 FVMOUNT3.6.1 安装状态3.…...
MySQL 数据库定时任务及进阶学习
一、引言 在当今数字化时代,数据管理的高效性和自动化至关重要。MySQL 作为一款广泛应用的开源关系型数据库管理系统,提供了强大的功能来满足各种数据处理需求。其中,定时任务执行功能对于自动化数据操作、维护数据完整性以及优化系统性能具…...
DeepSeek教unity------MessagePack-01
中文:GitCode - 全球开发者的开源社区,开源代码托管平台 MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍,并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏…...

知识拓展:Python序列化模块 marshal 模块详解
Python marshal 模块学习笔记 1. 简介 marshal 是 Python 的内部序列化格式,主要用于序列化和反序列化 Python 对象。它是 Python 字节码(.pyc文件)使用的序列化格式,比 pickle 更原始和受限,但也更快速和安全。 http…...

leetcode 2684. 矩阵中移动的最大次数
题目如下 数据范围 本题使用常规动态规划就行,不过要注意由于有三个转移的方向,所以我们对dp数组的遍历应该是从上到下 从左到右即按列优先遍历。通过代码 class Solution { public:int maxMoves(vector<vector<int>>& grid) {int …...

机械学习基础-6.更多分类-数据建模与机械智能课程自留
data modeling and machine intelligence - FURTHER CLASSIFICATION 混淆矩阵评估指标:灵敏度和特异度ROC 曲线文字说明部分 AUC:ROC曲线下面积 支持向量机思路补充背景知识点积超平面(HYPERPLANES超平面的法向量到超平面的最小距离数据集与超…...

自动化测试实战
http://8.137.19.140:9090/blog_login.htm 账号: lisi 密码: 123456 上面是系统链接 1. 自动化测试的步骤 1.1 编写Web测试用例 1.2 创建空项目添加依赖 然后我们创建一个新的java项目(使用maven管理),然后引入我们的配置文件:屏幕截图,驱动管理,selenium库 <dependency…...
qt QPlainTextEdit总结
QPlainTextEdit 概述 用途:专为处理纯文本设计,适合大文本编辑和简单文本显示(如日志、代码编辑器)。 特点:相比QTextEdit,轻量高效,支持快速加载和滚动大文件,默认不支持富文本。 …...
AWS SES 邮件服务退信/投诉处理与最佳实践指南
在使用 AWS SES 发送邮件时,合理处理退信和投诉是维护发送声誉的关键。本文将详细介绍 SES 中的退信/投诉处理机制以及相关最佳实践。 一、退信处理机制 © ivwdcwso (ID: u012172506) 1.1 退信类型 在 SES 中,退信分为两种类型: 硬退信(Hard Bounce) 永久性错误,如无效…...
理解WebGPU 中的 GPUAdapter :连接浏览器与 GPU 的桥梁
在 WebGPU 开发中, GPUAdapter 是一个至关重要的对象,它作为浏览器与 GPU 之间的桥梁,为开发者提供了请求 GPU 设备、查询 GPU 特性以及获取适配器信息的能力。本文将详细介绍 GPUAdapter 的核心属性和方法,并通过实际代码…...
rpx和px混用方案
(1)创建一个全局的样式配置文件: // styles/variables.scss :root {// 基础字体大小--font-size-xs: 12px;--font-size-sm: 14px;--font-size-md: 16px;--font-size-lg: 18px;// 响应式间距--spacing-xs: 5px;--spacing-sm: 10px;--spacing-…...
光伏设计软件分类:无人机、Unity3D引擎齐上阵
无人机3D设计 无人机可搭载高分辨率光学相机、激光雷达等测绘设备,对目标区域进行全方位、多角度的航拍作业。通过对采集到的影像数据进行导入处理,运用复杂的图像识别算法与三维重建技术,构建出云端实景3D模型,在实景3D模型中进…...

太速科技-616-基于6U VPX XCVU9P+XCZU7EV的双FMC信号处理板卡
基于6U VPX XCVU9PXCZU7EV的双FMC信号处理板卡 一、板卡概述 板卡基于6U VPX标准结构,包含一个XCVU9P 高性能FPGA,一片XCZU7EV FPGA,用于 IO扩展接口,双路HPC FMC扩展高速AD、DA、光纤接口等。是理想应用于高性能数字计算&…...

国产鲲鹏920+欧拉+达梦
1,访问达梦官网 产品下载-达梦数据 1.1,官网没有欧拉的版本; 1.2,拨打客服热线,联系售前单独获取试用版 2,创建鲲鹏920欧拉环境: 2.1,阿里云:没有arm系统 2.2…...
LeetCode--146. LRU 缓存【Golang中的list】
146. LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...