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

总结:使用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证书验证

总结&#xff1a;使用JDK原生HttpsURLConnection&#xff0c;封装HttpsUtil工具类&#xff0c;加载自定义证书验证&#xff0c;忽略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 参数污染&#xff08;HPP&#xff09;&#xff1f; HTTP 参数污染&#xff08;HTTP Parameter Pollution&#xff0c;简称 HPP&#xff09;是一种 Web 应用攻击技术&#xff0c;攻击者通过在 HTTP 请求中注入多个相同的参数来绕过安全控制或篡改应用逻辑&#…...

阿里云轻量服务器docker部署nginx

拉取nginx docker镜像 sudo docker pull nginx创建以下挂载目录及文件 用户目录下&#xff1a;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库两个重要的概念&#xff0c;在各位看完之后&#xff0c;需要决定自己的学习路线到底是学习HAL呢&#xff1f;还是寄存器呢&#xff1f;还是两者都学习呢&#xff1f; 库寄存器 库寄存器就是简单的封装了我们对寄存器的操作&#xf…...

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 数据库定时任务及进阶学习

一、引言 在当今数字化时代&#xff0c;数据管理的高效性和自动化至关重要。MySQL 作为一款广泛应用的开源关系型数据库管理系统&#xff0c;提供了强大的功能来满足各种数据处理需求。其中&#xff0c;定时任务执行功能对于自动化数据操作、维护数据完整性以及优化系统性能具…...

DeepSeek教unity------MessagePack-01

中文&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍&#xff0c;并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏…...

知识拓展:Python序列化模块 marshal 模块详解

Python marshal 模块学习笔记 1. 简介 marshal 是 Python 的内部序列化格式&#xff0c;主要用于序列化和反序列化 Python 对象。它是 Python 字节码&#xff08;.pyc文件&#xff09;使用的序列化格式&#xff0c;比 pickle 更原始和受限&#xff0c;但也更快速和安全。 http…...

leetcode 2684. 矩阵中移动的最大次数

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

机械学习基础-6.更多分类-数据建模与机械智能课程自留

data modeling and machine intelligence - FURTHER CLASSIFICATION 混淆矩阵评估指标&#xff1a;灵敏度和特异度ROC 曲线文字说明部分 AUC&#xff1a;ROC曲线下面积 支持向量机思路补充背景知识点积超平面&#xff08;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 概述 用途&#xff1a;专为处理纯文本设计&#xff0c;适合大文本编辑和简单文本显示&#xff08;如日志、代码编辑器&#xff09;。 特点&#xff1a;相比QTextEdit&#xff0c;轻量高效&#xff0c;支持快速加载和滚动大文件&#xff0c;默认不支持富文本。 …...

AWS SES 邮件服务退信/投诉处理与最佳实践指南

在使用 AWS SES 发送邮件时,合理处理退信和投诉是维护发送声誉的关键。本文将详细介绍 SES 中的退信/投诉处理机制以及相关最佳实践。 一、退信处理机制 © ivwdcwso (ID: u012172506) 1.1 退信类型 在 SES 中,退信分为两种类型: 硬退信(Hard Bounce) 永久性错误,如无效…...

理解WebGPU 中的 GPUAdapter :连接浏览器与 GPU 的桥梁

在 WebGPU 开发中&#xff0c; GPUAdapter 是一个至关重要的对象&#xff0c;它作为浏览器与 GPU 之间的桥梁&#xff0c;为开发者提供了请求 GPU 设备、查询 GPU 特性以及获取适配器信息的能力。本文将详细介绍 GPUAdapter 的核心属性和方法&#xff0c;并通过实际代码…...

rpx和px混用方案

&#xff08;1&#xff09;创建一个全局的样式配置文件&#xff1a; // 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设计 无人机可搭载高分辨率光学相机、激光雷达等测绘设备&#xff0c;对目标区域进行全方位、多角度的航拍作业。通过对采集到的影像数据进行导入处理&#xff0c;运用复杂的图像识别算法与三维重建技术&#xff0c;构建出云端实景3D模型&#xff0c;在实景3D模型中进…...

太速科技-616-基于6U VPX XCVU9P+XCZU7EV的双FMC信号处理板卡

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

国产鲲鹏920+欧拉+达梦

1&#xff0c;访问达梦官网 产品下载-达梦数据 1.1&#xff0c;官网没有欧拉的版本&#xff1b; 1.2&#xff0c;拨打客服热线&#xff0c;联系售前单独获取试用版 2&#xff0c;创建鲲鹏920欧拉环境&#xff1a; 2.1&#xff0c;阿里云&#xff1a;没有arm系统 2.2&#xf…...

LeetCode--146. LRU 缓存【Golang中的list】

146. LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用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模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 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)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...