总结:使用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 存在于缓存中,则返回关键字的值,…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
