springboot 开启https与http共存

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

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

1 首先我们要先生成证书

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

keytool -genkey -alias tomcat -dname "CN=Andy,OU=kfit,O=kfit,L=HaiDian,ST=BeiJing,C=CN" -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365

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

2 开启springboot SSL支持

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

#https端口号.
server.port=8089
##http端口号.
http.port=8080
#证书的路径.
server.ssl.key-store=classpath:keystore.p12
#证书密码,请修改为您自己证书的密码.
server.ssl.key-store-password=123456
#秘钥库类型
server.ssl.keyStoreType=PKCS12
#证书别名(和命令中的alias 值对应上否则会报错)
server.ssl.keyAlias=tomcat

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

 

keystore.png

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

开启http重定向https

import org.apache.catalina.Context;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpToHttpsContainerFactoryConfig {
    @Value("${server.port}")
    private int httpsPort;

    @Value("${http.port}")
    private int httpPort;

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat =
                new TomcatServletWebServerFactory() {

                    @Override
                    protected void postProcessContext(Context context) {
                        SecurityConstraint securityConstraint = new SecurityConstraint();
                        securityConstraint.setUserConstraint("CONFIDENTIAL");
                        SecurityCollection collection = new SecurityCollection();
                        collection.addPattern("/*");
                        securityConstraint.addCollection(collection);
                        context.addConstraint(securityConstraint);
                    }
                };
        tomcat.addAdditionalTomcatConnectors(createHttpConnector());
        return tomcat;
    }

    private Connector createHttpConnector() {
        Connector connector =
                new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(httpPort);
        connector.setRedirectPort(httpsPort);
        return connector;
    }
}

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



作者:FyK_21f8
链接:https://www.jianshu.com/p/ae4b8a2debbd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值