• 实用干货!看壹哥如何在SpringBoot项目中同时支持https和http协议


    最近壹哥的一个学生在做项目时碰到了一个特殊的需求,前端浏览器需要存放跨域请求的cookie,需要将cookie的secure属性设置为true。这样一来,就要求后端的接口必须以HTTPS协议提供访问,那么我们该如何在Springboot项目中使用Https协议呢?是否一定要花钱购买数字证书才可以呢?

    其实如果我们只是在开发和测试阶段,完全可以使用自定义的数字证书,并通过简单的配置,即可让Springboot程序切换成Https协议。

    接下来壹哥就带各位在SpringBoot项目中实现该功能。

    一. 创建自定义数字证书

    首先我们得创建一个自定义的数字证书。其实在JDK中,就提供了现成的工具用于生成数字证书,我们只需打开命令行工具,执行如下代码即可生成一个数字证书。

    1. keytool -genkeypair -alias springboot-https
    2. -keypass 123456 -keyalg RSA
    3. -keysize 2048 -validity 365
    4. -keystore d:/cert/springboot.keystore -storepass 123456

    执行结果如下图所示:

    这里会出现一个警告,我们按照提示更改一下证书密钥库的格式即可。 

    1. keytool -importkeystore -srckeystore d:/cert/springboot.keystore
    2. -destkeystore d:/cert/springboot.keystore -deststoretype pkcs12

    这样我们就将密钥库格式转换为pkcs12格式了,此时得到的密钥库文件如下图所示,其中springboot.keystore就是我们所需要的密钥库文件。

    二. 配置Springboot

    1. 导入数字证书

    接着我们要将生成的密钥库文件,放入到Springboot工程中的resources目录下,如下图所示:

     2. 创建yml配置文件

    然后添加如下格式的yml配置信息。

    1. server:
    2. ssl:
    3. #开启https
    4. enabled: true
    5. #指定存放证书的密钥库文件的位置
    6. key-store: classpath:springboot.keystore
    7. #密钥库文件的格式
    8. key-store-type: PKCS12
    9. #别名,需要与创建密钥库时的别名一致
    10. key-alias: springboot-https
    11. key-password: 123456
    12. key-store-password: 123456

    3. 创建Java测试类

    这里我们可以写一个Java测试类。

    1. @SpringBootApplication
    2. @RestController
    3. public class DemoApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(DemoApplication.class, args);
    6. }
    7. @RequestMapping("/")
    8. public String hello() {
    9. return "hello";
    10. }
    11. }

    4. 测试访问

    接下来我们启动程序,并通过默认的8080端口进行访问。

    此时我们会发现,当使用http协议访问时,会看到上图所示的错误提示信息,接着我们换成https协议访问。

    这里由于数字证书是我们自己生成的,没有CA给我们认证,因此浏览器给出了安全提示,我们只需点击高级按钮,继续前往即可。

    我们发现,最终接口就访问成功了。

    三. 同时支持http协议和https协议

    但在有的项目中,会要求我们同时支持http和https协议,这该怎么实现呢?我们继续往下看。

    1. 配置http端口

    首先我们在yml配置文件中,添加http端口号定义。

    1. http:
    2. port: 8888

    2. 创建配置类

    接着我们在Java配置类中,向IOC容器中添加如下Bean。

    1. @Value("${http.port}")
    2. private Integer httpPort;
    3. @Bean
    4. public ServletWebServerFactory servletContainer(){
    5. final Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    6. connector.setPort(httpPort);
    7. final TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    8. tomcat.addAdditionalTomcatConnectors(connector);
    9. return tomcat;
    10. }

    3. 启动测试

    启动项目时,我们会发现如下日志,Tomcat绑定了两个端口号,其中https绑定在8080,http绑定在8888。

    以Http协议访问会如下图所示,我们发现可以正常访问到接口。

    再以Https协议访问会如下图所示,也可以正常访问到接口。

    这样我们就实现了一个项目中同时支持http和https协议,现在你是不是学会了呢?如果你还有什么别的疑问,可以在评论区留言哦。关注壹哥,每天干货都不断!

  • 相关阅读:
    Mybatis-Plus介绍
    RTL8721DM 双频WIFI + 蓝牙5.0 物联网(IoT)应用
    js如何遍历对象的key和value
    【Transformers】第 1 章 :Hello Transformers
    外包干了5天,技术明显退步。。。。。
    电脑一键重装系统发现内存占用率过高怎么办
    MySQL使用全文索引+ngram全文解析器进行全文检索
    昨参观宋庆龄故居
    Kotlin小节(二)
    阶段六-Day02-Maven
  • 原文地址:https://blog.csdn.net/syc000666/article/details/126358749