提供HTTP、HTTPS都可访问的API

2023-10-26

情景说明
       考虑到数据的安全传输,现在用到HTTPS进行API调用的越来越多了。本节就介绍如何使自己编写的API能让别人
进行HTTP、HTTPS调用。


先看一下一般情况
正常编写一个

使用HTTP访问一下(不写的话,默认使用HTTP协议进行访问)

由此可见:HTTP是可以访问的,那么HTTPS呢?

由此可见,此时HTTPS是无法访问的!


软硬件环境:JDK1.8、Windows10、Eclipse、SpringBoot2.0.4RELEASE

准备工作:生成keystore证书库(秘钥库)

第一步:找到安装JDK的目录下的bin目录,并在此处打开cmd(或PowerShell)窗口

第二步:执行指令,生成对应的证书

此时,在相应位置即可看到生成的秘钥库(证书库)文件了:

给出上上图中的指令文字版(方便拷贝):

keytool -genkey -alias ds -keypass ds1994 -keyalg RSA -keysize 1024 -validity 730 -storetype PKCS12 -keystore C:/Users/JustryDeng/Desktop/dsstore.p12 -storepass ds1994

提示一:出于安全考虑,kiysize最好设置大一点,如2048,密码应该设置强一点。

提示二:本文标题【提供HTTP、HTTPS都可访问的API】中,HTTPS指的是【不作CA验证的HTTPS】如果想要
              进行CA验证的HTTPS访问的话,需要再根据此步骤中生成的keystore(如果想要进行CA验证的HTTPS访问
              的话,生成此步骤的keystore时,还需要指定hostname),生成ca证书,将ca证书交给客户端,客户端根据
              ca证书进行校验ca的HTTPS访问。具体细节以及操作示例可详见本人的这篇博客
              
https://blog.csdn.net/justry_deng/article/details/91569132

相关指令说明(提示:如果比较着急的话,可以不看这一块儿):

keytool工具:Java 数据证书的管理工具 ,keytool 将密钥(key)和证书(certificates)存在一个称为keystore的
                     秘钥库(证书库)文件中,在keystore里,包含两种数据:
                           
密钥实体(Key entity):密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)。
                            可信任的证书实体(trusted certificate entries):只包含公钥。

-genkey:生成一个秘钥库(证书库)文件(此文件的后缀名自定义也行,但一般按约定得来如:.keystory、.p12等等),存
               放生成的密钥对(即:私钥和公钥、
密钥实体和可信任的证书实体)。

-ailas:产生别名,每个keystore秘钥库(证书库)都关联这一个独一无二的alias,这个alias通常不区分大小写。

-keypass:指定别名条目ailas对应的密码(私钥的密码)。

-keyalg:指定密钥的算法(如:RSA、DSA、EC等,如果不指定则默认采用7DSA)

-keysize:秘钥位大小(指定秘钥长度)。

-validity:指定生成的证书的有效天数

-storetype:秘钥库(证书库)类型。证书库类型为:JKS、PKCS12等。jdk9以前,默认为JKS。自jdk9开始,默
                   认为PKCS12。

-keystore:指定存储密钥、证实实体的keystore名称,如果没有指定,那么将创建一个新的keystore库,并将其存
                储为 .keystore 文件。
                注:我们在指定时,可以指定其keystore的生成位置、名字等如:
                     C:/Users/JustryDeng/Desktop/dsstore.p12

-storepass:指定密钥库的密码,密钥库创建后,要对其做任何修改都必须提供该密码。

……


SpringBoot项目导入秘钥(证书)库

第一步:将生成的秘钥证书库放入项目资源文件夹下

第二步:在系统配置文件application.properties中,配置SSL

# 此端口为HTTPS端口
server.port = 9527
# 秘钥证书库文件所在位置
server.ssl.key-store = classpath:dsstore.p12
# 密码
server.ssl.key-store-password = ds1994
# 秘钥证书库类型
server.ssl.keyStoreType = PKCS12
# 别名条目
server.ssl.keyAlias= ds

#这里先放一个参数,一会儿再程序中直接@Value获取
myhttp.port = 8080

此时,启动项目,可以看见:

由此可见,此时:项目中的API就是只支持HTTPS协议的了。

第三步:配置一下项目启动类,使API既支持HTTPS又支持HTTP。

提示:到上面第二步结束,我们的项目就已经支持HTTPS了,这里我们只需要使项目再支持HTTPS的基础上,再支
        持HTTP即可。

import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class AbcDemoApplication{
	
	/* SpringBoot程序入口 */
	public static void main(String[] args) {
		SpringApplication.run(AbcDemoApplication.class, args);
	}
	
	@Value("${myhttp.port}")
    private Integer httpPort;

	/* SpringBoot 2.x版本(以及更高版本) 使用下面的代码 */
	@Bean
	public ServletWebServerFactory servletContainer() {
		TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
		tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
		return tomcat;
	}
	
	private Connector createHTTPConnector() {
		Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
		connector.setScheme("http");
		connector.setSecure(false);
		connector.setPort(httpPort);
		return connector;
	}
	
	/* SpringBoot 1.5.x版本(以及更低版本) 使用下面的代码 */
	//  @Bean
	//  public EmbeddedServletContainerFactory servletContainer() {
	//      TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
	//      // 添加http
	//      tomcat.addAdditionalTomcatConnectors(createStandardConnector()); 
	//      return tomcat;
	//  }
	//	// 配置http
	//  private Connector createStandardConnector() {
	//      Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
	//      connector.setPort(httpPort);
	//      return connector;
	//  }
	
}

此时,启动项目:

由此可见,此时,我们的API既支持HTTPS请求,又支持HTTP请求了。


测试一下

先简单编写一个controller

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * API支持HTTPS/HTTP测试
 *
 * @author JustryDeng
 * @DATE 2018年9月13日 上午8:36:29
 */
@RestController
public class Test {
	
	/**
	 * HTTP/HTTPS发送get请求
	 *
	 * @DATE 2018年9月13日 上午10:21:07
	 */
	@GetMapping("/get")
	public String testMethodGet(HttpServletRequest request) {
	    // 获取URL协议
	    String requestURL = request.getRequestURL().toString();
	    String protocol = requestURL.split("://")[0];
	    // 获取当前URL连接中的端口
	    Integer port = request.getServerPort();
		return "get ---> " + protocol + "\t" + port;
	}

	/**
	 * HTTP/HTTPS发送post请求
	 *
	 * @DATE 2018年9月13日 上午10:21:43
	 */
	@PostMapping("/post")
	public String testMethodPost(HttpServletRequest request, @RequestBody String bodyString) {
		// 获取URL协议
	    String requestURL = request.getRequestURL().toString();
	    String protocol = requestURL.split("://")[0];
	    // 获取当前URL连接中的端口
	    Integer port = request.getServerPort();
		return "post ---> " + protocol + "\t" + port + "\n" + bodyString;
	}

}

启动项目,使用postman进行HTTPS测试

提示:由于我们只配了秘钥(证书)库,但是还没有配置认证。我们这里主要测试是否可用https请求API,所以我们需要
          先在postman的设置里面,先把证书认证关闭

HTTPS发送get测试

HTTPS发送post测试

使用postman进行HTTP测试

HTTP发送get测试

HTTP发送post测试

自此:我们已实现了提供HTTP、HTTPS均可访问的API的功能了。

 

 

^_^ 参考链接、摘录内容出处
           https://baike.baidu.com/item/keytool/5885709?fr=aladdin
           https://blog.csdn.net/zlfing/article/details/77648430
           https://blog.csdn.net/wrs1226/article/details/49070681
           https://www.cnblogs.com/liaojie970/p/4916602.html
           https://www.jianshu.com/p/b6549f086b21
           https://blog.csdn.net/zmken497300/article/details/53186730

^_^ 如有不当之处,欢迎指正

^_^ 本文已经被收录进《程序员成长笔记(五)》,笔者JustryDeng

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提供HTTP、HTTPS都可访问的API 的相关文章

  • [CISCN2019 华北赛区 Day2 Web1]Hack World

    1 测试过滤 我想到到了 联合注入 unin被过滤 报错注入 and or updatexml被过滤 bool注入和time注入 and or被过滤 可以通过fuzz测试 模糊测试 发现哪些字符被过滤了 length为482的 全都是被过滤
  • LLVM编译流程

    LLVM概述 LLVM是构架编译器 compliter 的框架系统 以C 编写而成 用于优化以任意程序语言编写的程序的便是时间 compile time 链接时间 link time 运行时间 run time 以及空闲时间 idle ti
  • 网络编程--TCP/IP协议

    参考 https lijie blog csdn net article details 105297532 https blog csdn net qq 20785973 article details 83104695 https bl
  • 华为OD机试 - 分苹果(Python)

    题目描述 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多 输
  • JJWT三种算法的工具类实现

    前言 最近学习jwt生成token 一直各种报错 不知道怎么生成对应的秘钥 周末研究了一下 把jjwt的HMAC RSA ECDSA三种签名算法方式都实现了 并记录下来 依赖版本如下
  • 波场链通过Tron JS SDK TronWeb发送带备注的TRC - 20 转账及使用简介

    波场链通过tronWeb发送带备注的TRC 20 转账 var contractAddress TRC 20 合约 选择合约 法 let functionSelector transfer address uint256 根据 法构造参数
  • 应对程序员面试,你必须知道的八大数据结构

    大数据文摘出品 编译 Hope 睡不着的iris 胡笳 云舟 瑞士计算机科学家Niklaus Wirth在1976年写了一本书 名为 算法 数据结构 编程 40多年后 这个等式仍被奉为真理 这就是为什么在面试过程中 需要考察软件工程师对数据
  • java在大量增强for循环中找到某个特定对象去分析的方法-推荐使用debug工具(idea为例)

    场景 代码中有一部分增强for循环 里面是很复杂的处理逻辑 并且处理的AObjectList列表数量非常大 在这串代码中想看一下某个name为 小白 的对象的处理过程 如果断点直接打在for循环体内 可能要重复百次甚至千次以上才能找到这个对
  • 毕业设计-基于深度学习的目标检测算法

    目录 前言 课题背景和意义 实现技术思路 一 两阶段深度学习算法 二 单阶段深度学习方法 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个
  • 华为OD机试 - 最大平分数组( Python)

    题目描述 给定一个数组nums 可以将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 最大的平分组个数 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt 50
  • 使用C++的libcurl库实现HTTP的POST请求

    简介 libcurl库是由C语言编写的轻量级网络库 可以实现客户端的一些基本功能 本文使用libcurl库实现了HTTP的POST请求 代码 C 代码 使用POST方式完成对以下两个API的访问 localhost 8050 api dat
  • .NET框架介绍

    NET平台 如图所示最上层VB C C JScript等为编程语言 这些语言的基础是最底层的操作系统以及com组件和services服务程序 net语言的核心由 公共语言进行时 CLR 和基础类库 Base Class Library 两部
  • 【超分辨率】(EDSR)Enhanced Deep Residual Networks for Single Image Super-Resolution论文阅读笔记

    论文名称 Enhanced Deep Residual Networks for Single Image Super Resolution 论文下载地址 https arxiv org pdf 1707 02921 pdf 论文代码地址
  • 7.6、LSM6DSL_SENSOR_HUB模式

    7 6 LSM6DSL SENSOR HUB模式 文章目录 7 6 LSM6DSL SENSOR HUB模式 7 6 1 简介 7 6 2 LSM6DSL SENSOR HUB模式 7 6 3 sensor hub直连模式 7 6 4 测试
  • Flutter框架和原理剖析

    Flutter是Google推出并开源的跨平台开发框架 主打跨平台 高保真 高性能 开发者可以通过Dart语言开发Flutter应用 一套代码同时运行在ios和Android平台 不仅如此 flutter还支持web 桌面 嵌入应用的开发
  • 四象限运行模式_sem四象限分析法

    四象限分析法是SEM中一个常用方法 我们把账户内的关键词按照横坐标X 消费 纵坐标Y 转化 若无转化数据 替换为转化率 点击率均适用 按照以下四个象限进行分类 第一象限 高消费高转化 可能存在问题 账户设置待优化 主要 网站访问率 转化率低
  • 条件竞争漏洞Double Fetch

    前言 Double Fetch 双取 是一种条件竞争的漏洞 相关的论文发表在USENIX 论文链接 https www usenix org system files conference usenixsecurity17 sec17 wa
  • Qt基本控件及三大布局

    Qt基本模块 一 Qt的三大布局 QHBoxLayout 水平显示布局 所有在其上面摆放的控件只能水平排列下去 QVBoxLayout 垂直显示布局 所有在其上面摆放的控件只能垂直排列下去 QGridLayout 格子显示布局 可以按照表格

随机推荐

  • linux 权限字符串rwxr-xrw-所对应的八进制权限数字

    Linux下 查看某路径下用 ls l 或 ll 查看所有文件的详细属性列表时 会看到文件的操作权限 类似 drwxr xr x 的字符串 d 第一位表示文件类型 d 文件夹 普通文件 l 链接 b 块设备文件 p 管道文件 c 字符设备文
  • (三)最基础的分类算法-k邻近算法 KNN

    笔记 机器学习入门专栏笔记对应jupyternotebook以及封装的各种算法个人笔记 如有错误 感谢指出 机器学习文档类资源 CSDN文库 三 最基础的分类算法 k邻近算法 KNN 概括 根据经验取k值 找与k值最接近的k个点 进而判断预
  • 某网站前端页面性能测试

    1页面性能测试概述 页面性能测试则是针对于页面性能优化而开展的一种性能测试 目的是对Web系统的页面进行测试以确认系统页面是否会影响系统的性能并为页面的优化提供依据与建议 最终提升系统的整体性能表现 提高用户体验满意度 他的关注点是在与页面
  • Centos7/8 安装任意版本 python3 和 pip3

    一 准备工作 1 新环境更新系统 如果是新环境最好要先更新以下系统 yum update yum upgrade y 2 Centos8无法使用yum命令 如果是Centos8提示错误 repo appstream 下载元数据失败 Cann
  • sql 语句 将查询结果中数字等标示转成汉字

    使用case 语句 将sex 字段进行转换 0 1 2 男 女 未知 SELECT u userid u username CASE u sex WHEN 0 THEN 女 WHEN 1 THEN 男 ELSE null END 性别 FR
  • Spring : 缓存相关注解@EnableCaching、@CacheConfig、@Cacheable、@Caching

    1 美图 2 概述 缓存相关注解 解释 EnableCaching 开启缓存注解的支持 CacheConfig 用于统一制定一些配置参数 这样在其他缓存注解里面就不用重复指定 Cacheable 如果之前已经有缓存数据值直接返回缓存数据 否
  • Java 转 C++ 知识点

    目录 配置Clion同步远程环境 0 内存模型 1 变量的作用域 2 typedef与define的区别 3 类的继承范围 4 常量与常函数 5 传值 传引用 6 友元的意义 7 左移运算符重载 8 析构函数 9 带指针的类 10 转型 1
  • 堆——二叉树

    堆 特殊的完全二叉树 最大堆 父结点大于子结点 最小堆 父结点小于子结点 最小堆的较大数下移 最小堆的向下调整 include
  • 蓝桥杯2017年第八届真题-发现环

    题目 题目链接 题解 并查集 DFS 并查集比较明显 因为要判断有没有环 思路也很简单 若不停加边 若两个点的fa是一样的 则说明再加上这两点之间的直接 边就会出现环 因此这两个点一定位于环上 我们以两点中的其中一个点为起点 dfs寻找另一
  • Chromium命令行开关列表1

    Chromium命令行开关列表 Google Chrome浏览器可以使用很多命令行 一些更改功能的行为 其他用于调试或试验 该页面列出了可用的开关 包括其条件和说明 上一次自动更新发生在2020 08 12 Condition Explan
  • Ubuntu下ffmpeg的安装与配置

    安装 配置 FFmpeg包括了目前领先的音 视频编码库libavcodec 提供了录制 转换以及流化音视频的完整解决方案 其强大的功能包括视频采集功能 视频格式转换 视频抓图 给视频加水印等 安装 安装FFmpeg前 需要先安装依赖库 su
  • 完美解决Python各种no module named "XX"问题

    在腾讯云上玩Django 但总是遇到no module name django core wsgi 等问题 在django的 error log中也提示是 no module 但是 本地 python3 wsgi py或者 python3
  • Firefly安装说明

    第三方库依赖 twisted python memcached DBUtils MySQLdb 安装第三方库 1 easy install twisted windows下可以直接用Twisted 12 2 0 win32 py2 6 ex
  • 十年大厂产品的数据分析宝典(下):数据打点、分析、做图表、监控的实用技巧

    序 上半部分文章主要围绕指标 包括选定关键指标 主要指标VS次要指标 从关键结果指标拆解出过程指标 并定下阶段性目标 这些是数据分析的基础工作 在没有做好之前 不建议直接就开始做功能 打点取数等等 如果这部分已经做好了 那么可以看接下来的文
  • 一些测开面试题及答案(个人梳理)

    这里写目录标题 答案对错自辨 文明观看 有错给我说我改 1 白盒测试 黑盒测试 1 1白盒测试 1 2黑盒测试 2 测试流程 3 bug流程 4 压力测试 5 selenium原理 6 选取元素方法 7 servlet生命周期 8 Java
  • Baseline、Benchmark&SOTA

    Baseline Baseline A baseline is a value or starting point on a scale with which other values can be compared 通俗的讲 一个算法被称
  • 一个通过cookie实现的账号密码保存的案例(会分享cookie设置获取删除的封装函数哦)

    相信大家都玩过QQ 但细心地你是否发现有个保存密码的功能 当你选中保存账号密码时 等你下次登录的时候 将直接为你显示出来你的账号密码 省去了我们再次输入的时间 那么这样一个功能是如何实现的呢 我现在通过cookie简单为大家实现一下这个功能
  • 第六章树和二叉树-作业3-Huffman树

    判断题 1 1 对N 2 个权值均不相同的字符构造哈夫曼树 则树中任一非叶结点的权值一定不小于下一层任一结点的权值 T 选择题 2 1 对N N 2 个权值均不相同的字符构造哈夫曼树 下列关于该哈夫曼树的叙述中 错误的是 D A 树中一定没
  • XXE漏洞原理--简单理解

    XXE漏洞简介 1 XXE漏洞全称XML External Entity Injection 即xmI外部实体注入漏洞 XXE漏洞发生在应用程序解析XML输入时 没有禁止外部实体的加载 导致可加载恶意外部文件 造成文件读取 命令执行 内网端
  • 提供HTTP、HTTPS都可访问的API

    情景说明 考虑到数据的安全传输 现在用到HTTPS进行API调用的越来越多了 本节就介绍如何使自己编写的API能让别人 进行HTTP HTTPS调用 先看一下一般情况 正常编写一个 使用HTTP访问一下 不写的话 默认使用HTTP协议进行访