Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring Boot中加入Https为什么那么容易出错,有那么难吗?

spring Boot中加入Https为什么那么容易出错,有那么难吗?

原创
作者头像
Java周某人
修改于 2019-09-04 01:51:25
修改于 2019-09-04 01:51:25
1.2K00
代码可运行
举报
文章被收录于专栏:Java周某人Java周某人
运行总次数:0
代码可运行

https 现在已经越来越普及了,特别是做一些小程序或者公众号开发的时候,https 基本上都是刚需了。

不过一个 https 证书还是挺费钱的,个人开发者可以在各个云服务提供商那里申请一个免费的证书。我印象中有效期一年,可以申请 20 个。

今天要和大家聊的是在 Spring Boot 项目中,如何开启 https 配置,为我们的接口保驾护航。

https 简介

我们先来看看什么是 https:

超文本传输安全协议(HyperText Transfer Protocol Secure),缩写:HTTPS;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。

历史上,HTTPS 连接经常用于网络上的交易支付和企业信息系统中敏感信息的传输。在 2000 年代末至 2010 年代初,HTTPS 开始广泛使用,以确保各类型的网页真实,保护账户和保持用户通信,身份和网络浏览的私密性。

另外,还有一种安全超文本传输协议(S-HTTP),也是 HTTP 安全传输的一种实现,但是 HTTPS 的广泛应用而成为事实上的 HTTP 安全传输实现,S-HTTP并没有得到广泛支持。

准备工作

首先我们需要有一个 https 证书,我们可以从各个云服务厂商处申请一个免费的,不过自己做实验没有必要这么麻烦,我们可以直接借助 Java 自带的 JDK 管理工具 keytool 来生成一个免费的 https 证书。

进入到 %JAVVA_HOME%\bin 目录下,执行如下命令生成一个数字证书:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\javaboy.p12 -validity 365
1

命令含义如下:

  • genkey 表示要创建一个新的密钥。
  • alias 表示 keystore 的别名。
  • keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。
  • keysize 表示密钥的长度。
  • keystore 表示生成的密钥存放位置。
  • validity 表示密钥的有效时间,单位为天。

具体生成过程如下图:

命令执行完成后 ,我们在 D 盘目录下会看到一个名为 javaboy.p12 的文件。如下图:

有了这个文件之后,我们的准备工作就算是 OK 了。

引入 https

接下来我们需要在项目中引入 https。

将上面生成的 javaboy.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.properties 中添加如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server.ssl.key-store=classpath:javaboy.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=111111

其中:

  • key-store表示密钥文件名。
  • key-alias表示密钥别名。
  • key-store-password就是在cmd命令执行过程中输入的密码。

配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口,就会看到如下错误:

改用 https 来访问 ,结果如下:

这是因为我们自己生成的 https 证书不被浏览器认可,不过没关系,我们直接点击继续访问就可以了(实际项目中只需要更换一个被浏览器认可的 https 证书即可)。

请求转发

考虑到 Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,我们这里可以配置一个请求转发,当用户发起 HTTP 调用时,自动转发到 HTTPS 上。

具体配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class TomcatConfig {
 @Bean
 TomcatServletWebServerFactory tomcatServletWebServerFactory() {
 TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
 @Override
 protected void postProcessContext(Context context) {
 SecurityConstraint constraint = new SecurityConstraint();
 constraint.setUserConstraint("CONFIDENTIAL");
 SecurityCollection collection = new SecurityCollection();
 collection.addPattern("/*");
 constraint.addCollection(collection);
 context.addConstraint(constraint);
 }
 };
 factory.addAdditionalTomcatConnectors(createTomcatConnector());
 return factory;
 }
 private Connector createTomcatConnector() {
 Connector connector = new
 Connector("org.apache.coyote.http11.Http11NioProtocol");
 connector.setScheme("http");
 connector.setPort(8081);
 connector.setSecure(false);
 connector.setRedirectPort(8080);
 return connector;
 }
}

在这里,我们配置了 Http 的请求端口为 8081,所有来自 8081 的请求,将被自动重定向到 8080 这个 https 的端口上。

如此之后,我们再去访问 http 请求,就会自动重定向到 https。

结语

Spring Boot 中加入 https 其实很方便。如果你使用了 nginx 或者 tomcat 的话,https 也可以发非常方便的配置,从各个云服务厂商处申请到 https 证书之后,官方都会有一个详细的配置教程,一般照着做,就不会错了。

记得给我点个关注哦,每天都会分享Java有关的文章

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySql】表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过技术收到逼迫程序员插入正确的数据,反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的。约束的最终目标:保证数据的完整性和可预期性所以需要更多的约束。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primarykey,auto_increment,unique key 。
平凡的人1
2023/10/15
5180
【MySql】表的约束
初谈表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primarykey,auto_increment,unique key
南桥
2024/08/05
1200
初谈表的约束
MySQL数据库:表的约束
表的约束,实质上就是用数据类型去约束字段,但是数据类型的约束手法很单一,比如,我们在设置身份证号这个字段,数据类型唯一起的约束是它属于char类型或者varchar类型,不能是浮点型也不能是日期时间类型,但是这样还不够,身份证号需要有唯一性,是每个合法公民的唯一标识。因此需要额外增加一些手段去进行约束,以便更好的保证数据的合法性。
二肥是只大懒蓝猫
2023/10/13
8400
MySQL数据库:表的约束
表的约束(MySQL)
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
ljw695
2025/05/31
740
表的约束(MySQL)
MySQL数据库表约束详解
表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员,插入正确的数据。
用户11316056
2025/02/22
4550
MySQL数据库表约束详解
MySQL:表的约束
表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员,插入正确的数据。反过来,站在MySQL角度,凡是插入进来的数据,都是符合数据约束的!
小灵蛇
2024/11/22
3400
MySQL:表的约束
mysql-完整性约束
mysql> create table tb1(id int not null default 2,num int not null);  # 创建tb1表并约束
py3study
2018/08/03
8710
深入浅出:掌握MySQL表约束与数据完整性设计
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。
用户11286421
2025/03/20
1390
深入浅出:掌握MySQL表约束与数据完整性设计
【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)
这篇文章只是对以前的内容作个详细补充,想要速成操作的,可以参考这篇博客 【MySQL学习】:关系数据库标准语言SQL
IsLand1314
2025/02/09
1710
【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)
MySQL表的完整性约束
  为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。
changxin7
2019/09/10
3.6K0
MySQL之表的约束
一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 Z
人生不如戏
2018/04/10
4.9K0
【MySQL】数据库约束
喜欢做梦
2025/04/20
1990
【MySQL】数据库约束
数据库约束-主键约束-唯一约束-非空约束-默认值
约束其实就是一种限制,用于修饰表中的列. 通过这种限制来保证表中数据的正确性、有效性和完整性。
Devops海洋的渔夫
2022/01/17
6.7K0
数据库约束-主键约束-唯一约束-非空约束-默认值
第13章_约束
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
程序员Leo
2023/08/07
6310
第13章_约束
MySQL数据库,从入门到精通:第十三篇——MySQL数据表约束详解
在MySQL数据库中,约束是一种对数据表中数据进行限制和检查的方法,可以保证数据表中数据的完整性和一致性。本文将深入剖析MySQL中的各种约束,包括非空约束、唯一性约束、主键约束、自增列、外键约束、默认值约束以及CHECK约束等等,同时结合开发场景给出约束使用和实践的技巧和方法,帮助读者更好地掌握MySQL中数据表相关操作的技巧和方法。
默 语
2024/11/20
5040
MySQL数据库,从入门到精通:第十三篇——MySQL数据表约束详解
MySQL数据库2表的增删改查
每个字段由若干按照某种界限划分的相同数据类型的数据项组成,这里指的数据表中的列,一列就是一个字段
GH
2019/12/12
13.5K0
2024Mysql And Redis基础与进阶操作系列(4)作者——LJS[含MySQL FOREIGN KEY、CHECK 、DEFAULT 约束举例说明等详解步骤及常见报错问题所对应的解决方法]
例如:学生表、课程表、选课表:选课表的学生和课程要分别参考学生表和课程表,学生表和课程表是 主表,选课表是从表。
盛透侧视攻城狮
2024/10/22
2260
2024Mysql And Redis基础与进阶操作系列(4)作者——LJS[含MySQL FOREIGN KEY、CHECK 、DEFAULT 约束举例说明等详解步骤及常见报错问题所对应的解决方法]
表——完整约束性规则(键)
一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: primary key (PK) 标识该字段为该表的主键,可以唯一的标识记录 foreign key (FK) 标识该字段为该表的外键 not null 标识该字段不能为空 unique key (UK) 标识该字段的值是唯一的 auto_increment 标识该字段的值自动增长(整数类型,而且为主键) default 为该字段设置默认值 unsigned 无符号 z
用户1214487
2018/01/23
2.5K0
MySQL(数据类型和完整约束)
default默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
全栈程序员站长
2022/07/21
1K0
再谈表的约束
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。 自增长的特点:
南桥
2024/08/15
1250
再谈表的约束
相关推荐
【MySql】表的约束
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验