springboot 开启https与http共存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 开启https与http共存相关的知识,希望对你有一定的参考价值。

参考技术A 首先,服务器要同时支持http和https,需要通过重定向实现。因为https是必须提供支持的,那为何还要提供http的服务呢?直接访问https不就行了,不是多此一举吗?因为大家是习惯于只输入简单域名访问的,这时到达的就是http,如果不提供http的支持,用户还以为你的网站已经挂了呢。

两种协议都提供支持,所以是需要打开两个Socket端口的,一般http为8080,而https为8089。然后就需要把所有访问http的请求,重定向到https即可。不同的服务器有不同的实现,现在介Springboot的实现。

生成自签名证书,依靠jdk提供的keytool工具

接着会提示你输入密码,记住密码,别忘记了,这里以 123456 为例

在配置文件中添加ssl支持的配置

将我们生成的证书放在resource目录下

此时我们已经可以通过 8089 端口通过https访问了,但是今天的重点在于同时支持http和https,让http的请求重定向到https上

重启项目,通过 http://localhost:8080 访问项目,可以发现会自动跳转到https端口 https://localhost:8089 奥利给,又是充满希望的一天!

SpringBoot开启HTTPS

springboot 默认只开启 http请求,若是要开启https 需要生成证书和配置

 

1.首先打开CMD命令行工具,在JDK/bin目录下 生成证书.keystore

keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore F:/tomcat.keystore -storepass 123456

相关参数:

keytool 
-genkey 
-alias tomcat(别名) 
-keypass 123456(别名密码) 
-keyalg RSA(生证书的算法名称,RSA是一种非对称加密算法) 
-keysize 1024(密钥长度,证书大小) 
-validity 365(证书有效期,天单位) 
-keystore F:/tomcat.keystore(指定生成证书的位置和证书名称) 
-storepass 123456(获取keystore信息的密码)
- storetype (指定密钥仓库类型) 

 

springboot配置ssl(证书为.keystore文件)

1.将tomcat.keystore拷贝到项目根目录下(跟pom文件同级目录)

2.配置application.properties

#端口号
server.port=8443
#你生成的证书名字
server.ssl.key-store=tomcat.keystore
#密钥库密码
server.ssl.key-store-password=123456
server.ssl.keyStoreType=JKS
server.ssl.keyAlias:tomcat

3.修改springboot运行主类:实现http自动跳转https

package com.mingtong.demo_client;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoClientApplication.class, args);
    }
    
     @GetMapping("/login")
    public String login() {
       return "login";
    }
     
     /**
         * it\'s for set http url auto change to https
         */
        @Bean
        public EmbeddedServletContainerFactory servletContainer() {
            TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint = new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");// confidential
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(httpConnector());
            return tomcat;
        }

        @Bean
        public Connector httpConnector() {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8443);
            return connector;
        }
}

测试:访问http://localhost:8080/login,会自动跳转到https://localhost:8443/login

 

以上是关于springboot 开启https与http共存的主要内容,如果未能解决你的问题,请参考以下文章

H3C HCL与WSL2共存

nginx开启ssl并把http重定向到https的两种方式

SpringBoot开启HTTPS

Spring Boot同时开启HTTP和HTTPS服务

springBoot2.x启用https和兼容http

spring boot thymeleaf和jsp可以共存吗